4
votes

Remplacement de la méthode Arrays.toString ()

Je me demande simplement s'il est possible de remplacer la méthode toString () de la classe java.util.Arrays. Je fais un projet sur notre classe et je prévois de sortir mes tableaux au lieu de

[33, 12, 98] à [033, 012, 098]

Je me demande simplement s'il est possible de faire cela sans remplacer la méthode Arrays.toString ().

Merci pour votre aide :)


6 commentaires

Écrivez simplement la méthode dans votre propre classe et appelez cette méthode au lieu de Arrays.toString (). Pourquoi voudriez-vous que la méthode Arrays.toString () fasse autre chose que ce que sa documentation indique qu'elle fait?


Par écraser , j'espère que vous entendez remplacer .


Ce n'est pas possible, heureusement.


Remplissez simplement le contenu avec des zéros non significatifs en conséquence et imprimez le tableau tel quel.


comme elle est statique, il n'y a aucun moyen de redéfinir, ni nécessaire - cette méthode n'est normalement pas appelée automatiquement , donc vous pouvez simplement appeler n'importe quelle autre méthode (créée pour cela). Ou Arrays.stream ($ 1) .mapToObj (i -> String.format ("% 03d", i)). Collect (Collectors.joining (",", "[", "]"))


Quelle est l'attente pour le rembourrage? Pour ajouter UN 0 au début ou au pad gauche à la longueur de 3?


3 Réponses :


9
votes

Vous ne pouvez pas remplacer le tableau Arrays.toString (). Au lieu de cela, vous pouvez écrire votre propre méthode générique en ajoutant un 0 au début, quelque chose comme:

public static String toString(int arr[]) {
   return Arrays.stream(arr).mapToObj(s -> "0" + s)
                            .collect(Collectors.joining(", ", "[", "]"));
}

Et l'appeler simplement:

Integer arr[] = {13, 14, 15};
System.out.println(toString(arr));


0 commentaires

4
votes

Comme d'autres l'ont déjà mentionné, il n'est pas possible d'écraser Arrays.toString . La solution est d'écrire son propre code pour créer la chaîne, par exemple avec les flux Java 8:

int[] array = { 33, 12, 98 };
String result = 
      Arrays.stream(array)                            // stream of ints
            .boxed()                                  // converted to Integers
            .map(String::valueOf)                     // converted to String
            .map(s -> StringUtils.leftPad(s, 3, "0")) // left-padded
            .collect(Collectors.joining(", ", "[", "]"));       // appended together with , as separator


Assert.assertEquals("[033, 012, 098]", result);


4 commentaires

Cela nécessite une dépendance sur les communs Apache.


Oui. Bien sûr, si cela pose un problème, on pourrait opter pour String.format ("% 03d"). Personnellement, je préférerais la fonction Apache Commons StringUtils.leftPad ou Guava Strings.padStart.


Vous devez utiliser join (", "," [","] ")


@Andreas: Oui, c'est vrai.



3
votes

Si vous souhaitez un champ de largeur fixe rempli de zéros non significatifs, vous pouvez utiliser String.format () avec un symbole de format comme % 03d , en utilisant simplement bibliothèques Java standard.

Par exemple:

public static void main(String[] args) {
    int[] myarray = new int[] { 33, 12, 98, 123, 1 };
    String s = toString(myarray);
    System.out.println(s);
}

Avec l'entrée ci-dessous, le résultat est [033, 012, 098, 123, 001] em >.

static String toString(int[] array) {
    return Arrays.stream(array)
            .mapToObj(i -> String.format("%03d", i))    // <-- Format
            .collect(Collectors.joining(", ", "[", "]"));
}


1 commentaires

Vous devez utiliser join (", "," [","] ") . Pas besoin de StringBuilder .