En Java, les tableaux ne remplacent pas toString()
, donc si vous essayez d'en imprimer un directement, vous obtenez le className
+ '@' + l'hexagone du hashCode
tableau, tel que défini par Object.toString()
:
int[] intArray = new int[] {1, 2, 3, 4, 5};
System.out.println(intArray); // prints something like '[I@3343c8b3'
Mais généralement, nous voudrions en fait quelque chose de plus [1, 2, 3, 4, 5]
. Quelle est la façon la plus simple de procéder? Voici quelques exemples d'entrées et de sorties:
// Array of primitives:
int[] intArray = new int[] {1, 2, 3, 4, 5};
//output: [1, 2, 3, 4, 5]
// Array of object references:
String[] strArray = new String[] {"John", "Mary", "Bob"};
//output: [John, Mary, Bob]
hashCode()
hexadécimal. Tu voisObject#toString()
.Réponses:
Depuis Java 5, vous pouvez utiliser
Arrays.toString(arr)
ouArrays.deepToString(arr)
pour les tableaux dans les tableaux. Notez que laObject[]
version fait appel.toString()
à chaque objet du tableau. La sortie est même décorée de la manière exacte que vous demandez.Exemples:
Tableau simple:
Production:
Tableau imbriqué:
Production:
double
Tableau:Production:
int
Tableau:Production:
la source
String[] array = {"John", "Mahta", "Sara"}
et nous voulons que cette sortie sans support et des virgules:John Mahta Sara
?Arrays.deepToString()
accepte uniquement unObject []
(ou un tableau de classes qui s'étendentObject
, par exempleInteger
, donc il ne fonctionnera pas sur un tableau de type primitifint []
. MaisArrays.toString(<int array>)
fonctionne très bien pour les tableaux primitifs.System.out.println(String.join(" ", new String[]{"John", "Mahta", "Sara"}))
va imprimerJohn Mahta Sara
.String.join(" ", "John", "Mahta", "Sara")
car la.join(...)
méthode prend le tableau comme paramètre vararg .Vérifiez toujours les bibliothèques standard en premier.
Alors essaye:
ou si votre tableau contient d'autres tableaux en tant qu'éléments:
la source
String[] array = {"John", "Mahta", "Sara"}
et nous voulons que cette sortie sans support et des virgules:John Mahta Sara
?String.join(" ", Arrays.asList(array))
. docC'est agréable à savoir, cependant, car pour "toujours vérifier les bibliothèques standard en premier", je ne serais jamais tombé sur l'astuce de
Arrays.toString( myarray )
- depuis que je me concentrais sur le type de myarray pour voir comment faire cela. Je ne voulais pas avoir à répéter la chose: je voulais un appel facile pour le faire sortir similaire à ce que je vois dans le débogueur Eclipse et myarray.toString () ne le faisait tout simplement pas.
la source
String[] array = {"John", "Mahta", "Sara"}
et nous voulons que cette sortie sans support et des virgules:John Mahta Sara
?Dans JDK1.8, vous pouvez utiliser des opérations d'agrégation et une expression lambda:
la source
Arrays.stream(strArray).forEach(System.out::println);
System.out::println
une référence de méthode Java 8. Votre code produit un lambda inutile.Arrays.asList
et faitesArrays.stream(strArray).forEach(System.out::println)
Stream.of
serait de le faire.skip(n).limit(m)
. L'implémentation actuelle ne renvoie pas de flux SIZED, contrairement à ce qui seArrays.stream(T[], int, int)
produit, ce qui entraîne une meilleure répartition des performances si vous souhaitez effectuer des opérations en parallèle. De plus, si vous en avez unint[]
, vous pouvez accidentellement utiliserStream.of
ce qui retournera unStream<int[]>
avec un seul élément, toutArrays.stream
en vous donnantIntStream
directement un .À partir de Java 8, on pourrait également profiter de la
join()
méthode fournie par la classe String pour imprimer les éléments du tableau, sans les crochets, et séparés par un délimiteur de choix (qui est le caractère espace pour l'exemple illustré ci-dessous):La sortie sera "Hey there amigo!".
la source
Si vous utilisez Java 1.4, vous pouvez à la place:
(Cela fonctionne aussi dans 1.5+, bien sûr.)
la source
Arrays.toString
Comme réponse directe, la solution fournie par plusieurs, dont @Esko , en utilisant les méthodes
Arrays.toString
etArrays.deepToString
, est tout simplement la meilleure.Java 8 - Stream.collect (rejoindre ()), Stream.forEach
Ci-dessous, j'essaie d'énumérer certaines des autres méthodes suggérées, en essayant de s'améliorer un peu, l'ajout le plus notable étant l'utilisation de l'
Stream.collect
opérateur, en utilisant a , pour imiter ce que fait.joining
Collector
String.join
la source
Avant Java 8
Nous aurions pu utiliser
Arrays.toString(array)
pour imprimer un tableau unidimensionnel etArrays.deepToString(array)
pour des tableaux multidimensionnels.Java 8
Nous avons maintenant la possibilité
Stream
etlambda
d'imprimer le tableau.Impression d'un tableau unidimensionnel:
La sortie est:
Impression d'un tableau multidimensionnel Au cas où nous souhaiterions imprimer un tableau multidimensionnel, nous pouvons l'utiliser
Arrays.deepToString(array)
comme:Maintenant, le point à observer est que la méthode
Arrays.stream(T[])
, qui en cas deint[]
retour nousStream<int[]>
et ensuite la méthodeflatMapToInt()
mappe chaque élément de flux avec le contenu d'un flux mappé produit en appliquant la fonction de mappage fournie à chaque élément.La sortie est:
la source
String[] array = {"John", "Mahta", "Sara"}
et nous voulons que cette sortie sans support et des virgules:John Mahta Sara
?Arrays.deepToString(arr)
imprime uniquement sur une seule ligne.Pour obtenir une table à imprimer en tant que table à deux dimensions, je devais faire ceci:
Il semble que la
Arrays.deepToString(arr)
méthode doive prendre une chaîne de séparation, mais malheureusement ce n'est pas le cas.la source
la source
n
est la valeur réelle du tableau, pas l'index. Pour une boucle for régulière, ce serait également le cas(someArray.length - 1) == i
, car elle casse lorsquei
est égal à la longueur du tableau.Différentes façons d'imprimer des tableaux en Java:
Manière simple
En utilisant
toString()
Impression d'un tableau de tableaux
Ressource: accéder à un tableau
la source
À mon avis, l' utilisation de la boucle for régulière est le moyen le plus simple d'imprimer un tableau. Ici, vous avez un exemple de code basé sur votre intArray
Il donne la sortie comme la vôtre 1, 2, 3, 4, 5
la source
System.out.print(intArray[i]); if(i != intArray.length - 1) System.out.print(", ");
System.out.print(i + (i < intArray.length - 1 ? ", " : ""));
pour combiner ces deux lignes.Je suis tombé sur ce post dans Vanilla #Java récemment. Ce n'est pas très pratique d'écrire
Arrays.toString(arr);
, puis d'importerjava.util.Arrays;
tout le temps.Veuillez noter qu'il ne s'agit en aucun cas d'une solution permanente. Juste un hack qui peut simplifier le débogage.
L'impression d'un tableau donne directement la représentation interne et le hashCode. Maintenant, toutes les classes ont
Object
comme type parent. Alors, pourquoi ne pas pirater leObject.toString()
? Sans modification, la classe Object ressemble à ceci:Et si cela est changé en:
Cette classe modded peut simplement être ajoutée au chemin de classe en ajoutant ce qui suit à la ligne de commande:
-Xbootclasspath/p:target/classes
.Maintenant, avec la disponibilité de
deepToString(..)
depuis Java 5, letoString(..)
peut facilement être changé endeepToString(..)
pour ajouter la prise en charge des tableaux qui contiennent d'autres tableaux.J'ai trouvé que c'était un hack assez utile et ce serait génial si Java pouvait simplement l'ajouter. Je comprends les problèmes potentiels liés à la présence de très grands tableaux, car les représentations de chaînes peuvent être problématiques. Peut-être passer quelque chose comme un
System.out
ou unPrintWriter
pour de telles éventualités.la source
if
conditions sur chaque objet?Object
parent commun? Pouvons-nous approfondir cette idée? Non pas que je pense que modifier le comportement par défaut des objets java.lang. * Est quelque chose que j'encouragerais ...Il devrait toujours fonctionner quelle que soit la version JDK que vous utilisez:
Cela fonctionnera si le
Array
contient des objets. Si leArray
contient des types primitifs, vous pouvez utiliser des classes wrapper au lieu de stocker directement la primitive sous la forme ..Exemple:
Remplacez-le par:
Mise à jour :
Oui ! il faut mentionner que la conversion d'un tableau en un tableau d'objets OU pour utiliser le tableau d'objets est coûteuse et peut ralentir l'exécution. cela se produit par la nature de java appelée autoboxing.
Donc, uniquement à des fins d'impression, il ne doit pas être utilisé. nous pouvons faire une fonction qui prend un tableau comme paramètre et imprime le format souhaité comme
la source
toString(..)
, ça me bat pourquoi quelqu'un ferait jamais ça.En java 8, c'est facile. il y a deux mots clés
Arrays.stream(intArray).forEach
référence de méthode:
::println
Si vous souhaitez imprimer tous les éléments du tableau sur la même ligne, utilisez simplement
print
au lieu deprintln
ieUne autre façon, sans référence de méthode, utilisez simplement:
la source
Il existe un moyen supplémentaire si votre tableau est de type char []:
impressions
la source
Pour ajouter à toutes les réponses, l'impression de l'objet sous forme de chaîne JSON est également une option.
Utiliser Jackson:
Utilisation de Gson:
la source
Vous pouvez parcourir le tableau en imprimant chaque élément en boucle. Par exemple:
Production:
la source
Il existe des moyens suivants pour imprimer le tableau
la source
Voici un raccourci simplifié que j'ai essayé:
Il imprimera
Aucune boucle requise dans cette approche et il est préférable pour les petits tableaux uniquement
la source
La boucle For-each peut également être utilisée pour imprimer des éléments du tableau:
la source
la source
L'utilisation des méthodes org.apache.commons.lang3.StringUtils.join (*) peut être une option
Par exemple:
J'ai utilisé la dépendance suivante
la source
Il s'agit d'un doublon pour l' impression d'un octet [] . Remarque: pour un tableau d'octets, il existe des méthodes supplémentaires qui peuvent être appropriées.
Vous pouvez l'imprimer en tant que chaîne s'il contient des caractères ISO-8859-1.
ou s'il contient une chaîne UTF-8
ou si vous voulez l'imprimer en hexadécimal.
ou si vous voulez l'imprimer en base64.
ou si vous souhaitez imprimer un tableau de valeurs d'octets signés
ou si vous souhaitez imprimer un tableau de valeurs d'octets non signés
la source
la source
si vous utilisez jdk 8.
production:
la source
toString()
dans la finaleSystem.out.println()
et l'utiliserais aujoiner.add(element.toString())
lieu d'ajouter la chaîne vide. Cette solution fonctionne également pour les tableaux de types non primitifs.element.toString()
intérieurjoiner.add()
est réservé aux types non primitifs. Vous devez toujours utiliser desInteger.toString(element)
constructions similaires à celles des types primitifs. Personnellement, j'ai utilisé foreach loopfor (int element : array) joiner.add(Integer.toString(element));
au lieu de streams, mais c'est une question de goût.En java 8:
la source
Si vous utilisez la bibliothèque Commons.Lang , nous pourrions faire:
ArrayUtils.toString(array)
Production:
la source
// Si vous imprimez l'adresse de l'élément de tableau sur la console en java.
la source
Il existe plusieurs façons d'imprimer les éléments d'un tableau. Tout d'abord, je vais vous expliquer, qu'est-ce qu'un tableau? en RAM. Ces blocs de mémoire sont pris une unité ..
Ok, je vais créer un tableau comme celui-ci,
Regardez maintenant la sortie,
Vous pouvez voir une chaîne inconnue imprimée .. Comme je l'ai mentionné précédemment, l'adresse mémoire dont le tableau (tableau de nombres) déclaré est imprimé. Si vous souhaitez afficher des éléments dans le tableau, vous pouvez utiliser "for loop", comme ceci ..
Regardez maintenant la sortie,
Ok, Éléments imprimés avec succès d'un tableau à une dimension..Je vais maintenant considérer un tableau à deux dimensions..Je vais déclarer un tableau à deux dimensions comme "nombre2" et imprimer les éléments en utilisant le mot clé "Arrays.deepToString ()". Vous devrez importer la bibliothèque 'java.util.Arrays'.
considérez la sortie,
Dans le même temps, en utilisant deux pour les boucles, les éléments 2D peuvent être imprimés .. Merci!
la source