Domanda

In Java, le matrici non sovrascrivono toString(), quindi se si tenta di stamparne una direttamente, si ottiene il className + @ + l'esagono di hashCode dell'array, come definito da Object.toString():

int[] intArray = new int[] {1, 2, 3, 4, 5};
System.out.println(intArray);     // prints something like '[I@3343c8b3'

Ma di solito vorremmo davvero qualcosa di più simile a [1, 2, 3, 4, 5]. Qual è il modo più semplice per farlo? Ecco alcuni esempi di input e output:

// 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]
È stato utile?

Soluzione

Dal momento che Java 5 è possibile utilizzare Arrays.toString(arr) o Arrays.deepToString(arr) per array all'interno di array. Si noti che la Object[] versione chiama .toString() su ciascun oggetto dell'array. L'output è persino decorato esattamente nel modo in cui lo chiedi.

Esempi:

  • Array semplice:

    String[] array = new String[] {"John", "Mary", "Bob"};
    System.out.println(Arrays.toString(array));
    

    Output:

    [John, Mary, Bob]
    
  • Array nidificato:

    String[][] deepArray = new String[][] {{"John", "Mary"}, {"Alice", "Bob"}};
    System.out.println(Arrays.toString(deepArray));
    //output: [[Ljava.lang.String;@106d69c, [Ljava.lang.String;@52e922]
    System.out.println(Arrays.deepToString(deepArray));
    

    Output:

    [[John, Mary], [Alice, Bob]]
    
  • double Matrice:

    double[] doubleArray = { 7.0, 9.0, 5.0, 1.0, 3.0 };
    System.out.println(Arrays.toString(doubleArray));
    

    Output:

    [7.0, 9.0, 5.0, 1.0, 3.0 ]
    
  • int Matrice:

    int[] intArray = { 7, 9, 5, 1, 3 };
    System.out.println(Arrays.toString(intArray));
    

    Output:

    [7, 9, 5, 1, 3 ]
    

Altri suggerimenti

Controlla sempre prima le librerie standard. Prova:

System.out.println(Arrays.toString(array));

o se l'array contiene altri array come elementi:

System.out.println(Arrays.deepToString(array));

È bello sapere, comunque, come per " controlla sempre prima le librerie standard " Non mi sarei mai imbattuto nel trucco di Arrays.toString( myarray )

- dal momento che mi stavo concentrando sul tipo di myarray per vedere come farlo. Non volevo dover passare in rassegna la cosa: volevo una semplice chiamata per farlo uscire simile a quello che vedo nel debugger di Eclipse e myarray.toString () non lo facevo.

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

In JDK1.8 è possibile utilizzare operazioni di aggregazione e un'espressione lambda:

String[] strArray = new String[] {"John", "Mary", "Bob"};

// #1
Arrays.asList(strArray).stream().forEach(s -> System.out.println(s));

// #2
Stream.of(strArray).forEach(System.out::println);

// #3
Arrays.stream(strArray).forEach(System.out::println);

/* output:
John
Mary
Bob
*/

Se stai usando Java 1.4, puoi invece fare:

System.out.println(Arrays.asList(array));

(Funziona anche in 1.5+, ovviamente.)

A partire da Java 8, si potrebbe anche trarre vantaggio dal metodo join() fornito da Classe stringa per stampare elementi dell'array, senza parentesi, e separati da un delimitatore di scelta (che è lo spazio carattere per l'esempio mostrato di seguito):

String[] greeting = {"Hey", "there", "amigo!"};
String delimiter = " ";
String.join(delimiter, greeting) 

L'output sarà " Hey there amigo! " ;.

Arrays.toString

Come risposta diretta, la soluzione fornita da diversi, tra cui @Esko , utilizzando Arrays.toString e Arrays.deepToString , è semplicemente il migliore.

Java 8 - Stream.collect (joining ()), Stream.forEach

Di seguito provo ad elencare alcuni degli altri metodi suggeriti, tentando di migliorare un po ', con l'aggiunta più notevole è l'uso di Stream.collect , usando un < code> entrare in Collector , per imitare ciò che sta facendo String.join .

int[] ints = new int[] {1, 2, 3, 4, 5};
System.out.println(IntStream.of(ints).mapToObj(Integer::toString).collect(Collectors.joining(", ")));
System.out.println(IntStream.of(ints).boxed().map(Object::toString).collect(Collectors.joining(", ")));
System.out.println(Arrays.toString(ints));

String[] strs = new String[] {"John", "Mary", "Bob"};
System.out.println(Stream.of(strs).collect(Collectors.joining(", ")));
System.out.println(String.join(", ", strs));
System.out.println(Arrays.toString(strs));

DayOfWeek [] days = { FRIDAY, MONDAY, TUESDAY };
System.out.println(Stream.of(days).map(Object::toString).collect(Collectors.joining(", ")));
System.out.println(Arrays.toString(days));

// These options are not the same as each item is printed on a new line:
IntStream.of(ints).forEach(System.out::println);
Stream.of(strs).forEach(System.out::println);
Stream.of(days).forEach(System.out::println);

Prima di Java 8

Avremmo potuto usare Arrays.toString (array) per stampare un array monodimensionale e Arrays.deepToString (array) per array multidimensionali.

Java 8

Ora abbiamo l'opzione Stream e lambda per stampare l'array.

Stampa di array monodimensionali:

public static void main(String[] args) {
    int[] intArray = new int[] {1, 2, 3, 4, 5};
    String[] strArray = new String[] {"John", "Mary", "Bob"};

    //Prior to Java 8
    System.out.println(Arrays.toString(intArray));
    System.out.println(Arrays.toString(strArray));

    // In Java 8 we have lambda expressions
    Arrays.stream(intArray).forEach(System.out::println);
    Arrays.stream(strArray).forEach(System.out::println);
}

L'output è:

  

[1, 2, 3, 4, 5]
  [John, Mary, Bob]
  1
  2
  3
  4
  5
  John
  Mary
  Bob

Stampa di array multidimensionali Nel caso in cui desideriamo stampare un array multidimensionale, possiamo usare Arrays.deepToString (array) come:

public static void main(String[] args) {
    int[][] int2DArray = new int[][] { {11, 12}, { 21, 22}, {31, 32, 33} };
    String[][] str2DArray = new String[][]{ {"John", "Bravo"} , {"Mary", "Lee"}, {"Bob", "Johnson"} };

    //Prior to Java 8
    System.out.println(Arrays.deepToString(int2DArray));
    System.out.println(Arrays.deepToString(str2DArray));

    // In Java 8 we have lambda expressions
    Arrays.stream(int2DArray).flatMapToInt(x -> Arrays.stream(x)).forEach(System.out::println);
    Arrays.stream(str2DArray).flatMap(x -> Arrays.stream(x)).forEach(System.out::println);
} 

Ora il punto da osservare è che il metodo Arrays.stream (T []) , che in caso di int [] ci restituisce Stream < int [] > e quindi il metodo flatMapToInt () mappa ogni elemento del flusso con il contenuto di un flusso mappato prodotto applicando la funzione di mappatura fornita a ciascun elemento.

L'output è:

  

[[11, 12], [21, 22], [31, 32, 33]]
  [[John, Bravo], [Mary, Lee], [Bob, Johnson]]
  11
  12
  21
  22
  31
  32
  33
  John
  Bravo
  Mary
  Lee
  Bob
  Johnson

Arrays.deepToString (arr) stampa solo su una riga.

int[][] table = new int[2][2];

Per ottenere effettivamente una tabella da stampare come una tabella bidimensionale, ho dovuto fare questo:

System.out.println(Arrays.deepToString(table).replaceAll("],", "]," + System.getProperty("line.separator")));

Sembra che il metodo Arrays.deepToString (arr) dovrebbe prendere una stringa di separazione, ma sfortunatamente no.

for(int n: someArray) {
    System.out.println(n+" ");
}

Diversi modi di stampare array in Java:

  1. Modo semplice

    List<String> list = new ArrayList<String>();
    list.add("One");
    list.add("Two");
    list.add("Three");
    list.add("Four");
    // Print the list in console
    System.out.println(list);
    
  

Output:       [Uno, Due, Tre, Quattro]

  1. Uso di toString()

    String[] array = new String[] { "One", "Two", "Three", "Four" };
    System.out.println(Arrays.toString(array));
    
  

Output: [Uno, Due, Tre, Quattro]

  1. Stampa di array di array

    String[] arr1 = new String[] { "Fifth", "Sixth" };
    String[] arr2 = new String[] { "Seventh", "Eight" };
    String[][] arrayOfArray = new String[][] { arr1, arr2 };
    System.out.println(arrayOfArray);
    System.out.println(Arrays.toString(arrayOfArray));
    System.out.println(Arrays.deepToString(arrayOfArray));
    
  

Output: [[Ljava.lang.String; @ 1ad086a [[Ljava.lang.String; @ 10385c1,   [Ljava.lang.String; @ 42719c] [[Quinto, sesto], [settimo, ottavo]]

Risorsa: Accesso Una matrice

L'uso del normale ciclo per è il modo più semplice di stampare array secondo me. Qui hai un codice di esempio basato sul tuo intArray

for (int i = 0; i < intArray.length; i++) {
   System.out.print(intArray[i] + ", ");
}

Fornisce output come il tuo     1, 2, 3, 4, 5

Mi sono imbattuto in questo post in Vanilla #Java recentemente. Non è molto conveniente scrivere Arrays.toString (arr); , quindi importare java.util.Arrays; sempre.

Nota, questa non è una soluzione permanente in alcun modo. Solo un trucco che può semplificare il debug.

La stampa di un array fornisce direttamente la rappresentazione interna e l'hashCode. Ora, tutte le classi hanno Object come tipo parent. Quindi, perché non hackerare Object.toString () ? Senza modifiche, la classe Object si presenta così:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

Che cosa succede se questo viene modificato in:

public String toString() {
    if (this instanceof boolean[])
        return Arrays.toString((boolean[]) this);
    if (this instanceof byte[])
        return Arrays.toString((byte[]) this);
    if (this instanceof short[])
        return Arrays.toString((short[]) this);
    if (this instanceof char[])
        return Arrays.toString((char[]) this);
    if (this instanceof int[])
        return Arrays.toString((int[]) this);
    if (this instanceof long[])
        return Arrays.toString((long[]) this);
    if (this instanceof float[])
        return Arrays.toString((float[]) this);
    if (this instanceof double[])
        return Arrays.toString((double[]) this);
    if (this instanceof Object[])
        return Arrays.deepToString((Object[]) this);
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

Questa classe modificata può essere semplicemente aggiunta al percorso della classe aggiungendo quanto segue alla riga di comando: -Xbootclasspath / p: target / classes .

Ora, con la disponibilità di deepToString (..) da Java 5, toString (..) può essere facilmente modificato in deepToString (.. ) per aggiungere il supporto per array che contengono altri array.

Ho trovato questo un trucco abbastanza utile e sarebbe fantastico se Java potesse semplicemente aggiungere questo. Comprendo potenziali problemi con array molto grandi poiché le rappresentazioni delle stringhe potrebbero essere problematiche. Forse passare qualcosa come un System.out o un PrintWriter per tali eventualità.

Dovrebbe funzionare sempre qualunque versione JDK usi:

System.out.println(Arrays.asList(array));

Funzionerà se Array contiene oggetti. Se Array contiene tipi di primitive, è possibile utilizzare le classi wrapper invece di archiviare la primitiva direttamente come ..

Esempio:

int[] a = new int[]{1,2,3,4,5};

Sostituiscilo con:

Integer[] a = new Integer[]{1,2,3,4,5};

Aggiornamento:

Sì! questo è da ricordare che la conversione di un array in un array di oggetti OPPURE l'utilizzo dell'array di oggetti è costoso e può rallentare l'esecuzione. succede per natura di java chiamato autoboxing.

Quindi, solo a scopo di stampa, non dovrebbe essere usato. possiamo creare una funzione che accetta un array come parametro e stampa il formato desiderato come

public void printArray(int [] a){
        //write printing code
} 

In java 8 è facile. ci sono due parole chiave

  1. stream: Arrays.stream(intArray).forEach
  2. riferimento al metodo: ::println

    int[] intArray = new int[] {1, 2, 3, 4, 5};
    Arrays.stream(intArray).forEach(System.out::println);
    

Se vuoi stampare tutti gli elementi dell'array sulla stessa riga, usa semplicemente print invece di println cioè

int[] intArray = new int[] {1, 2, 3, 4, 5};
Arrays.stream(intArray).forEach(System.out::print);

Un altro modo senza riferimento al metodo basta usare:

int[] intArray = new int[] {1, 2, 3, 4, 5};
System.out.println(Arrays.toString(intArray));

C'è un altro modo se il tuo array è di tipo char []:

char A[] = {'a', 'b', 'c'}; 

System.out.println(A); // no other arguments

stampe

abc

Per aggiungere a tutte le risposte, è anche possibile stampare l'oggetto come una stringa JSON.

Uso di Jackson:

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
System.out.println(ow.writeValueAsString(anyArray));

Uso di Gson:

Gson gson = new Gson();
System.out.println(gson.toJson(anyArray));

Un collegamento semplificato che ho provato è questo:

    int x[] = {1,2,3};
    String printableText = Arrays.toString(x).replaceAll("[\\[\\]]", "").replaceAll(", ", "\n");
    System.out.println(printableText);

Stampa

1
2
3

Non sono richiesti loop in questo approccio ed è preferibile solo per array di piccole dimensioni

È possibile eseguire il loop nell'array, stampando ogni elemento mentre si esegue il loop. Ad esempio:

String[] items = {"item 1", "item 2", "item 3"};

for(int i = 0; i < items.length; i++) {

    System.out.println(items[i]);

}

Output:

item 1
item 2
item 3

Esistono modi seguenti per stampare la matrice

 // 1) toString()  
    int[] arrayInt = new int[] {10, 20, 30, 40, 50};  
    System.out.println(Arrays.toString(arrayInt));

// 2 for loop()
    for (int number : arrayInt) {
        System.out.println(number);
    }

// 3 for each()
    for(int x: arrayInt){
         System.out.println(x);
     }
public class printer {

    public static void main(String[] args) {
        String a[] = new String[4];
        Scanner sc = new Scanner(System.in);
        System.out.println("enter the data");
        for (int i = 0; i < 4; i++) {
            a[i] = sc.nextLine();
        }
        System.out.println("the entered data is");
        for (String i : a) {
            System.out.println(i);
        }
      }
    }

L'uso dei metodi org.apache.commons.lang3.StringUtils.join (*) può essere un'opzione
Ad esempio:

String[] strArray = new String[] { "John", "Mary", "Bob" };
String arrayAsCSV = StringUtils.join(strArray, " , ");
System.out.printf("[%s]", arrayAsCSV);
//output: [John , Mary , Bob]

Ho usato la seguente dipendenza

<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>

Per ogni ciclo può anche essere usato per stampare elementi dell'array:

int array[] = {1, 2, 3, 4, 5};
for (int i:array)
    System.out.println(i);

Questo è contrassegnato come duplicato per stampare un byte [] . Nota: per un array di byte ci sono metodi aggiuntivi che possono essere appropriati.

Puoi stamparlo come stringa se contiene caratteri ISO-8859-1.

String s = new String(bytes, StandardChars.ISO_8559);
System.out.println(s);
// to reverse
byte[] bytes2 = s.getBytes(StandardChars.ISO_8559);

o se contiene una stringa UTF-8

String s = new String(bytes, StandardChars.UTF_8);
System.out.println(s);
// to reverse
byte[] bytes2 = s.getBytes(StandardChars.UTF_8);

o se vuoi stamparlo come esadecimale.

String s = DatatypeConverter.printHexBinary(bytes);
System.out.println(s);
// to reverse
byte[] bytes2 = DatatypeConverter.parseHexBinary(s);

o se vuoi stamparlo come base64.

String s = DatatypeConverter.printBase64Binary(bytes);
System.out.println(s);
// to reverse
byte[] bytes2 = DatatypeConverter.parseBase64Binary(s);

o se si desidera stampare un array di valori di byte con segno

String s = Arrays.toString(bytes);
System.out.println(s);
// to reverse
String[] split = s.substring(1, s.length() - 1).split(", ");
byte[] bytes2 = new byte[split.length];
for (int i = 0; i < bytes2.length; i++)
    bytes2[i] = Byte.parseByte(split[i]);

o se si desidera stampare un array di valori byte non firmati

String s = Arrays.toString(
               IntStream.range(0, bytes.length).map(i -> bytes[i] & 0xFF).toArray());
System.out.println(s);
// to reverse
String[] split = s.substring(1, s.length() - 1).split(", ");
byte[] bytes2 = new byte[split.length];
for (int i = 0; i < bytes2.length; i++)
    bytes2[i] = (byte) Integer.parseInt(split[i]); // might need a range check.
// array of primitives:
int[] intArray = new int[] {1, 2, 3, 4, 5};

System.out.println(Arrays.toString(intArray));

output: [1, 2, 3, 4, 5]

// array of object references:
String[] strArray = new String[] {"John", "Mary", "Bob"};

System.out.println(Arrays.toString(strArray));

output: [John, Mary, Bob]

In java 8:

Arrays.stream(myArray).forEach(System.out::println);

Esistono diversi modi per stampare gli elementi di un array. Prima di tutto, ti spiego che cos'è un array? .. L'array è una struttura di dati semplice per l'archiviazione dei dati .. Quando si definisce un array, Allocate set of blocchi di memoria ausiliari nella RAM. Questi blocchi di memoria sono presi in un'unità.

Ok, creerò un array come questo,

class demo{
      public static void main(String a[]){

           int[] number={1,2,3,4,5};

           System.out.print(number);
      }
}

Ora guarda l'output,

 inserisci qui la descrizione dell'immagine

Puoi vedere una stringa sconosciuta stampata ... Come ho detto prima, viene stampato l'indirizzo di memoria il cui array dichiarato (array numerico). Se vuoi visualizzare elementi nell'array, puoi usare " per loop " , come questo ..

class demo{
      public static void main(String a[]){

           int[] number={1,2,3,4,5};

           int i;

           for(i=0;i<number.length;i++){
                 System.out.print(number[i]+"  ");
           }
      }
}

Ora guarda l'output,

 inserisci qui la descrizione dell'immagine

Ok, elementi stampati con successo di un array di dimensioni ... Ora prenderò in considerazione un array di due dimensioni ... Dichiarerò un array di due dimensioni come "numero2". e stampa gli elementi usando " Arrays.deepToString () " parola chiave Prima di utilizzarlo Dovrai importare la libreria "java.util.Arrays".

 import java.util.Arrays;

 class demo{
      public static void main(String a[]){

           int[][] number2={{1,2},{3,4},{5,6}};`

           System.out.print(Arrays.deepToString(number2));
      }
}

considera l'output,

 inserisci qui la descrizione dell'immagine

Allo stesso tempo, usando due per i loop, è possibile stampare elementi 2D ... Grazie!

se stai eseguendo jdk 8.

public static void print(int[] array) {
    StringJoiner joiner = new StringJoiner(",", "[", "]");
    Arrays.stream(array).forEach(element -> joiner.add(element + ""));
    System.out.println(joiner.toString());
}


int[] array = new int[]{7, 3, 5, 1, 3};
print(array);

uscita:

[7,3,5,1,3]

Se si utilizza Biblioteca Commons.Lang , si potrebbe fare:

ArrayUtils.toString (array)

int[] intArray = new int[] {1, 2, 3, 4, 5};
String[] strArray = new String[] {"John", "Mary", "Bob"};
ArrayUtils.toString(intArray);
ArrayUtils.toString(strArray);

Output:

{1,2,3,4,5}
{John,Mary,Bob}

Se si desidera stampare, valutare il contenuto dell'array in questo modo è possibile utilizzare Arrays.toString

jshell> String[] names = {"ram","shyam"};
names ==> String[2] { "ram", "shyam" }

jshell> Arrays.toString(names);
$2 ==> "[ram, shyam]"

jshell> 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top