W Javie tablice nie zastępują toString()
, więc jeśli spróbujesz wydrukować jedną bezpośrednio, otrzymasz className
+ '@' + hex hashCode
tablicy, zgodnie z definicją Object.toString()
:
int[] intArray = new int[] {1, 2, 3, 4, 5};
System.out.println(intArray); // prints something like '[I@3343c8b3'
Ale zwykle chcielibyśmy czegoś bardziej podobnego [1, 2, 3, 4, 5]
. Jak najprościej to zrobić? Oto kilka przykładowych danych wejściowych i wyjściowych:
// 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()
w systemie szesnastkowym. ZobaczyćObject#toString()
.Odpowiedzi:
Od wersji Java 5 można używać
Arrays.toString(arr)
lubArrays.deepToString(arr)
do tablic w obrębie tablic. Pamiętaj, żeObject[]
wersja wywołuje.toString()
każdy obiekt w tablicy. Wyjście jest nawet udekorowane dokładnie tak, jak pytasz.Przykłady:
Prosta tablica:
Wynik:
Zagnieżdżona tablica:
Wynik:
double
Szyk:Wynik:
int
Szyk:Wynik:
źródło
String[] array = {"John", "Mahta", "Sara"}
i chcemy to wyjście bez wspornika i przecinkami:John Mahta Sara
?Arrays.deepToString()
akceptuje tylkoObject []
(lub tablicę rozszerzających się klasObject
, takich jakInteger
, więc nie będzie działać na prymitywnej tablicy typuint []
. AleArrays.toString(<int array>)
działa dobrze dla prymitywnych tablic.System.out.println(String.join(" ", new String[]{"John", "Mahta", "Sara"}))
wydrukujeJohn Mahta Sara
.String.join(" ", "John", "Mahta", "Sara")
dla.join(...)
metoda przyjmuje tablicę jako vararg parametru.Zawsze najpierw sprawdź biblioteki standardowe.
Więc spróbuj:
lub jeśli twoja tablica zawiera inne tablice jako elementy:
źródło
String[] array = {"John", "Mahta", "Sara"}
i chcemy to wyjście bez wspornika i przecinkami:John Mahta Sara
?String.join(" ", Arrays.asList(array))
. docWarto jednak wiedzieć, że „zawsze najpierw sprawdzaj biblioteki standardowe”. Nigdy nie natknąłem się na sztuczkę
Arrays.toString( myarray )
- odkąd skoncentrowałem się na typie tablicy, aby zobaczyć, jak to zrobić. Nie chciałem wykonywać iteracji: chciałem łatwego wywołania, aby wyglądało podobnie do tego, co widzę w debuggerze Eclipse i myarray.toString () po prostu tego nie robił.
źródło
String[] array = {"John", "Mahta", "Sara"}
i chcemy to wyjście bez wspornika i przecinkami:John Mahta Sara
?W JDK1.8 możesz używać operacji agregujących i wyrażenia lambda:
źródło
Arrays.stream(strArray).forEach(System.out::println);
System.out::println
odniesienie do metody Java 8. Twój kod wytwarza niepotrzebną lambda.Arrays.asList
i zróbArrays.stream(strArray).forEach(System.out::println)
Stream.of
byłoby użycie.skip(n).limit(m)
. Bieżąca implementacja nie zwraca strumienia SIZEDArrays.stream(T[], int, int)
, co prowadzi do lepszego podziału wydajności, jeśli chcesz wykonywać operacje równolegle. Również jeśli maszint[]
, możesz przypadkowo użyć tego,Stream.of
co zwróci aStream<int[]>
z jednym elementem, aArrays.stream
da ciIntStream
bezpośrednio.Począwszy od Java 8, można również skorzystać z
join()
metody dostarczonej przez klasę String, aby wydrukować elementy tablicy bez nawiasów i oddzielić ogranicznikiem wyboru (który jest znakiem spacji dla przykładu pokazanego poniżej):Wyjście będzie brzmiało „Hej, amigo!”.
źródło
Jeśli używasz Java 1.4, możesz zamiast tego:
(Oczywiście działa to również w wersji 1.5+).
źródło
Arrays.toString
Jako bezpośrednia odpowiedź, rozwiązanie dostarczone przez kilka, w tym @Esko , przy użyciu metod
Arrays.toString
iArrays.deepToString
, jest po prostu najlepsze.Java 8 - Stream.collect (joining ()), Stream.forEach
Poniżej próbuję wymienić niektóre z innych sugerowanych metod, starając się nieco poprawić, przy czym najbardziej zauważalnym dodatkiem jest użycie
Stream.collect
operatora, za pomocą , do naśladowania tego, co robi.joining
Collector
String.join
źródło
Przed Javą 8
Mogliśmy użyć
Arrays.toString(array)
do drukowania tablicy jednowymiarowej iArrays.deepToString(array)
tablic wielowymiarowych.Java 8
Teraz mamy opcję
Stream
ilambda
wydrukować tablicę.Drukowanie macierzy jednowymiarowej:
Dane wyjściowe to:
Drukowanie macierzy wielowymiarowej Na wypadek, gdybyśmy chcieli wydrukować macierz wielowymiarową, możemy użyć
Arrays.deepToString(array)
jako:Teraz należy zauważyć, że metoda
Arrays.stream(T[])
, która w przypadkuint[]
zwrotów,Stream<int[]>
a następnie metodaflatMapToInt()
mapuje każdy element strumienia z zawartością zmapowanego strumienia wytworzonego przez zastosowanie dostarczonej funkcji mapowania do każdego elementu.Dane wyjściowe to:
źródło
String[] array = {"John", "Mahta", "Sara"}
i chcemy to wyjście bez wspornika i przecinkami:John Mahta Sara
?Arrays.deepToString(arr)
drukuje tylko w jednej linii.Aby faktycznie wydrukować tabelę jako tabelę dwuwymiarową, musiałem to zrobić:
Wygląda na to, że
Arrays.deepToString(arr)
metoda powinna pobrać ciąg separatora, ale niestety tak nie jest.źródło
źródło
n
to rzeczywista wartość z tablicy, a nie indeks. W przypadku zwykłej pętli for również byłoby(someArray.length - 1) == i
, ponieważ pęka, gdyi
jest równa długości tablicy.Różne sposoby drukowania tablic w Javie:
Prosta droga
Za pomocą
toString()
Drukowanie tablic tablic
Zasób: Uzyskaj dostęp do tablicy
źródło
Moim zdaniem użycie regularnej pętli for jest najprostszym sposobem drukowania tablicy. Tutaj masz przykładowy kod oparty na twojej tablicy intArray
Daje wynik jako twój 1, 2, 3, 4, 5
źródło
System.out.print(intArray[i]); if(i != intArray.length - 1) System.out.print(", ");
System.out.print(i + (i < intArray.length - 1 ? ", " : ""));
do połączenia tych dwóch linii.Ostatnio natknąłem się na ten post w Vanilla #Java . Nie jest to zbyt wygodne pisanie
Arrays.toString(arr);
, a następniejava.util.Arrays;
cały czas importowanie .Uwaga: w żadnym wypadku nie jest to stała poprawka. Tylko hack, który może ułatwić debugowanie.
Drukowanie tablicy bezpośrednio daje wewnętrzną reprezentację i hashCode. Teraz wszystkie klasy mają
Object
typ nadrzędny. Dlaczego więc nie zhakowaćObject.toString()
? Bez modyfikacji klasa Object wygląda następująco:Co jeśli zmieni się to na:
Ten Modded klasa może być po prostu dodane do ścieżki klasy poprzez dodanie następujących do wiersza poleceń:
-Xbootclasspath/p:target/classes
.Teraz, dzięki dostępności
deepToString(..)
od wersji Java 5,toString(..)
można łatwo zmienić,deepToString(..)
aby dodać obsługę tablic zawierających inne tablice.Uważam, że jest to dość przydatny hack i byłoby wspaniale, gdyby Java mogła to po prostu dodać. Rozumiem potencjalne problemy z posiadaniem bardzo dużych tablic, ponieważ reprezentacje ciągów mogą być problematyczne. Może podać coś takiego jak a
System.out
lubPrintWriter
na takie ewentualności.źródło
if
warunki na każdym obiekcie?Object
wspólnego elementu nadrzędnego? Czy możemy dalej rozwinąć ten pomysł? Nie dlatego, że myślę, że modyfikowanie domyślnego zachowania obiektów java.lang. * Zachęciłbym ...Powinno zawsze działać niezależnie od używanej wersji JDK:
Będzie działać, jeśli
Array
zawiera obiekty. JeśliArray
zawiera typy prymitywne, możesz użyć klas opakowujących zamiast tego przechowywać prymityw bezpośrednio jako ...Przykład:
Zamień na:
Aktualizacja :
Tak ! należy wspomnieć, że konwersja tablicy na tablicę obiektów LUB w celu użycia tablicy obiektów jest kosztowna i może spowolnić wykonywanie. dzieje się tak z powodu natury java zwanej autoboxing.
Więc tylko do celów drukowania, nie należy go używać. możemy stworzyć funkcję, która przyjmuje tablicę jako parametr i wypisuje żądany format jako
źródło
toString(..)
, pokonuje mnie, dlaczego ktoś miałby to zrobić.W java 8 jest to łatwe. są dwa słowa kluczowe
Arrays.stream(intArray).forEach
odwołanie do metody:
::println
Jeśli chcesz wydrukować wszystkie elementy w tablicy w tej samej linii, po prostu użyj
print
zamiastprintln
npInnym sposobem bez odwołania do metody jest użycie:
źródło
Istnieje jeden dodatkowy sposób, jeśli tablica jest typu char []:
odciski
źródło
Aby dodać do wszystkich odpowiedzi, można również wydrukować obiekt jako ciąg JSON.
Za pomocą Jacksona:
Korzystanie z Gson:
źródło
Możesz zapętlać tablicę, drukując każdy element, gdy zapętlasz. Na przykład:
Wynik:
źródło
Istnieje sposób na wydrukowanie macierzy
źródło
Uproszczony skrót, który wypróbowałem, to:
Wydrukuje się
W tym podejściu nie są wymagane żadne pętle i najlepiej jest je stosować tylko w przypadku małych tablic
źródło
Pętla For-each może również służyć do drukowania elementów tablicy:
źródło
źródło
Opcją może być użycie metod org.apache.commons.lang3.StringUtils.join (*)
Na przykład:
Użyłem następującej zależności
źródło
Jest to oznaczone jako duplikat do wydrukowania bajtu [] . Uwaga: w przypadku tablicy bajtów istnieją dodatkowe metody, które mogą być odpowiednie.
Możesz wydrukować go jako ciąg znaków, jeśli zawiera znaki ISO-8859-1.
lub jeśli zawiera ciąg UTF-8
lub jeśli chcesz wydrukować go w systemie szesnastkowym.
lub jeśli chcesz wydrukować jako base64.
lub jeśli chcesz wydrukować tablicę podpisanych wartości bajtów
lub jeśli chcesz wydrukować tablicę wartości bajtów bez znaku
źródło
źródło
jeśli używasz jdk 8.
wynik:
źródło
toString()
w finaleSystem.out.println()
i użyłem gojoiner.add(element.toString())
zamiast dodawać pusty ciąg. To rozwiązanie działa również w przypadku tablic typów innych niż pierwotne, jednakowo.element.toString()
środkujoiner.add()
jest tylko dla typów nieprymitywnych. Nadal musisz używaćInteger.toString(element)
podobnych do konstrukcji prymitywnych typów. Osobiście użyłem pętli foreachfor (int element : array) joiner.add(Integer.toString(element));
zamiast strumieni, ale to kwestia gustu.W java 8:
źródło
Jeśli korzystamy z biblioteki Commons.Lang , moglibyśmy:
ArrayUtils.toString(array)
Wynik:
źródło
// Jeśli wydrukujesz adres elementu tablicy na konsoli w Javie.
źródło
Istnieje kilka sposobów drukowania elementów tablicy. Po pierwsze, wyjaśnię, co to jest tablica? .. Tablica to prosta struktura danych do przechowywania danych. Kiedy definiujesz tablicę, Przydziel zestaw pomocniczych bloków pamięci w pamięci RAM. Te bloki pamięci są pobierane po jednej jednostce.
Ok, utworzę taką tablicę,
Teraz spójrz na wynik,
Możesz zobaczyć wydrukowany nieznany ciąg .. Jak już wspomniałem, drukowany jest adres pamięci, którego zadeklarowana tablica (tablica liczb). Jeśli chcesz wyświetlać elementy w tablicy, możesz użyć „for loop”, jak to ..
Teraz spójrz na wynik,
Ok, pomyślnie wydrukowałem elementy jednej tablicy wymiarów .. Teraz zamierzam rozważyć tablicę dwóch wymiarów .. Zadeklaruję tablicę dwóch wymiarów jako „numer2” i wydrukuję elementy za pomocą słowa kluczowego „Arrays.deepToString ()”. Będziesz musiał zaimportować bibliotekę „java.util.Arrays”.
rozważ wynik,
W tym samym czasie, korzystając z dwóch pętli, można wydrukować elementy 2D .. Dziękuję!
źródło