Convertir tableau string en entiers

6222 - Modifié le 26 nov. 2022 à 12:42
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 - 26 nov. 2022 à 13:37

Bonjour, j'ai un code et je dois créer une méthode qui va convertir un tableau de string en entiers, mais l'utilisateur doit choisir 1 des polynômes du tableau. Sauf que quand j'essaye d'afficher l'entier, je reçois du n'importe quoi. Voici mon code:

private static int[] afficherPolynomes() {
    Scanner clavier = new Scanner(System.in);
    final String[] polynomes = {"4;4;",
            "2;8;-7;6;", "3;-5;", "0;0;3;", "8;-4;6;", "1;6;-8;4;", "0;5;5;1;6", "7;-3;8;"
    };
    for (int i = 1; i < polynomes.length; i++) {
        System.out.println((i) + ". " + polynomes[i]);
    }
    int nombre = clavier.nextInt();
    String chaine = polynomes[nombre];
    String[] tableau = chaine.split(";");
    int[] entiers = new int[tableau.length];
    for (int i = 0; i < entiers.length; i++) {
        entiers[i] = Integer.parseInt(tableau[i]);
    }
    System.out.println(entiers);
    return entiers;
}

2 réponses

Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
26 nov. 2022 à 07:47

Bonjour 

Ça ne t'affiches pas n'importe quoi, mais ce que tu lui as demandé, pas ce que tu crois avoir demandé. Ceci

System.out.println(entiers);

n'affiche pas le contenu du tableau, mais quelque chose qui représente ou désigne la variable entiers (et donc pas les différentes variables item du tableau). Je ne suis pas assez calé en Java pour en être certain, mais ça ressemble fort à une adresse mémoire.

Essaye d'afficher l'élément 0 de entiers et tu verras que ça correspond plus à ce que tu attends 


0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
26 nov. 2022 à 07:48

PS pour tes prochains posts, merci de forcer la coloration en java comme indiqué là https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
26 nov. 2022 à 13:30

Bonjour,

Je commence par répondre au problème, tu peux faire : 

System.out.println(Arrays.toString(entiers)); // import java.util.Arrays;

Maintenant quelques explications pourquoi ça t'affichais "n'importe quoi" et qui ressemble à [I@1234abc

Dans la classe java.lang.System, l'attribut out est un objet de type PrintStream
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/System.html#out

Dans la classe java.io.PrintStream, il existe 10 méthodes println() qui s'utilisent avec différents types de paramètres.
Puisque ton type de paramètre est un int[] tu rentres dans le cadre général de la méthode println(Object)
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/io/PrintStream.html#println(java.lang.Object)

La documentation indique que dans ce cas on affichage le résultat de String.valueOf(x)
Dans la classe String, il existe 9 méthodes valueOf, mais ton int[] va être traité par la méthode valueOf(Object)
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/String.html#valueOf(java.lang.Object)

Le comportement de la méthode dans ce cas c'est d'appelé la méthode toString() de l'objet (s'il n'est pas null)
Si elle n'est pas surchargée par une sous-classe - et c'est ton cas - la méthode toString qui est appelée est celle de la classe Object.
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/Object.html#toString()

L'implémentation est inscrit dans la documentation, il s'agit de :

getClass().getName() + '@' + Integer.toHexString(hashCode())

On peut donc séparer ton affichage [I@1234abc en deux parties :

  • le [I qui correspond à getClass().getName()
  • le 1234abc qui correspond à Integer.toHexString(hashCode())

La méthode getClass() qui est définie par la classe Objet permet de connaître le type de chaque objet.
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/Object.html#getClass()

Ici, c'est un peu spécial car il s'agit d'un tableau, c'est donc une classe générée automatiquement, dont le nom est constituée d'un [ suivi du nom de la classe dans l'objet.

Par exemple : la classe d'un String[] a pour nom [ et java.lang.String soit [java.lang.String
Et comme on peut faire des tableaux, ça peut se combiner, donc la classe d'un String[][] a pour nom un [ suivi du contenu, c'est à dire un [java.lang.String, ce qui donne pour nom [[java.lang.String

Dans ton cas c'est un peu particulier car tu utilises un tableau du type primitif, qui n'est pas vraiment un objet.
Du coup chacun des tableau de primitif est associé à une lettre :

  • boolean[] => [Z
  • byte[] => [B
  • char[] => [C
  • int[] => [I
  • long[] => [J
  • float[] => [F
  • double[] => [D

On a donc éclairci le [I et passons au 1234abc

Comme le code indique, il s'agit de l'écriture hexadécimale (de 0 à f) du résultat de la méthode hashCode()

Toutes les classes peuvent redéfinir la méthode hashCode (et c'est même plutôt conseillé), mais par défaut c'est celle de la classe Objet qui est considérée.
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/Object.html#hashCode()

L'implémentation dépend du système, c'est sûrement plus ou moins lié à une adresse mémoire, mais ça ne peut pas être exactement ça vu que le résultat du hashCode est un int (sur 32 bits) alors qu'aujourd'hui la plupart des systèmes gèrent des adresses mémoires sur 64 bits.

Remarque : on peut récupérer cette valeur de hash par défaut via la méthode System.identiyHashCode, y compris si la méthode hashCode a été redéfinie pour l'objet considéré.
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/System.html#identityHashCode(java.lang.Object)


0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 656
26 nov. 2022 à 13:37

Hello, pfff c'est compliqué Java, en C#, c'est aussi ToString qui est affiché, mais dans ce cas serait "int()", c'est plus clair ;)

0
Rejoignez-nous