Próbuję wydrukować wszystkie elementy a List
, ale wypisuje wskaźnik Object
raczej niż wartość.
To jest mój kod do drukowania ...
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
Czy ktoś mógłby mi pomóc, dlaczego nie drukuje wartości elementów.
List
? Pokaż, jak to zadeklarowałeś i utworzyłeś instancję.for (Object obj : list) {System.out.println(obj);}
.Odpowiedzi:
Oto kilka przykładów wypisywania składnika listy:
źródło
Model
klasy jest powiązane z pytaniem?Poniższy kod jest zwarty i pozwala uniknąć pętli w przykładowym kodzie (i daje ładne przecinki):
Jednak, jak zauważyli inni, jeśli nie masz zaimplementowanych sensownych metod toString () dla obiektów na liście, dostaniesz obserwowane wskaźniki obiektów (kody skrótu). Dzieje się tak niezależnie od tego, czy są na liście, czy nie.
źródło
list.toString()
.toString
, rozwiązanie wydrukuje również nazwę swojej klasy i kod skrótu.Arrays
metoda jest pomocna w przypadku tablic, ale nie jest teraz potrzebna w przypadku podklasAbstractCollection
.Od wersji Java 8 List dziedziczy domyślną metodę „forEach”, którą można połączyć z referencją do metody „System.out :: println” w następujący sposób:
źródło
println
wyjścia?toString()
oAbstractCollection
będzie czyste i dość łatwe do zrobienia, że .AbstractList
jest podklasąAbstractCollection
, więc nie ma potrzeby używania pętli ani funkcji toArray ().Jeśli używasz dowolnego niestandardowego obiektu na liście, powiedzmy Student, musisz przesłonić jego
toString()
metodę (zawsze warto przesłonić tę metodę), aby uzyskać znaczący wynikZobacz poniższy przykład:
wynik:
źródło
list
:List -> Collection -> Iterable -> Object
. Jest to klasa, która faktycznie dziedziczy po AbstractCollectionArrayList
. Tak więc w tym przykładzie potoString()
wywołaniu znajdujeArrayList
implementację zdefiniowaną wAbstractCollection
. Zwróć uwagę na hierarchię dziedziczenia dlaArrayList
:ArrayList -> AbstractList -> AbstractCollection -> Collection -> Iterable -> Object
Podejście do strumieni Java 8 ...
źródło
Obiekty na liście muszą mieć
toString
zaimplementowane, aby mogły wydrukować coś ważnego do zeskanowania.Oto szybki test, aby zobaczyć różnice:
Po uruchomieniu wyniki wydrukowane na ekranie są następujące:
Ponieważ T1 nie zastępuje metody toString, jego instancja t1 jest drukowana jako coś, co nie jest bardzo przydatne. Z drugiej strony, T2 przesłania toString, więc kontrolujemy, co drukuje, gdy jest używane we / wy, i widzimy coś nieco lepszego na ekranie.
źródło
Zastanów się,
List<String> stringList
które można wydrukować na wiele sposobów za pomocą konstrukcji Java 8 :Czym różnią się od siebie te podejścia?
Pierwsze podejście (
Iterable.forEach
) - zazwyczaj używany jest iterator kolekcji, który jest zaprojektowany tak, aby działał szybko, co oznacza, że zostanie rzucony,ConcurrentModificationException
jeśli podstawowa kolekcja zostanie zmodyfikowana strukturalnie podczas iteracji. Jak wspomniano w dokumencie dlaArrayList
:Oznacza to, że
ArrayList.forEach
ustawienie wartości jest dozwolone bez żadnych problemów. A w przypadku równoczesnego gromadzenia, npConcurrentLinkedQueue
. Iterator byłby słabo spójny, co oznacza, że przekazane działaniaforEach
mogą dokonywać nawet zmian strukturalnych bezConcurrentModificationException
wyjątku. Ale tutaj modyfikacje mogą, ale nie muszą być widoczne w tej iteracji.Drugie podejście (
Stream.forEach
) - Kolejność jest niezdefiniowana. Chociaż może nie wystąpić w przypadku strumieni sekwencyjnych, ale specyfikacja tego nie gwarantuje. Konieczne jest również, aby działanie nie miało charakteru zakłócającego. Jak wspomniano w dokumencie :Trzecie podejście (
Stream.forEachOrdered
) - Akcja zostanie wykonana w kolejności spotkania strumienia. Tak więc zawsze, gdy liczy się kolejność, korzystajforEachOrdered
bez zastanowienia. Jak wspomniano w dokumencie :Podczas iteracji nad zsynchronizowanym kolekcji na pierwsze podejście byłoby wziąć blokadę kolekcji na raz i będzie trzymać go we wszystkich wywołań metody działania, ale w przypadku strumieni używają spliterator kolekcji, która nie blokuje i opiera się na już ustalonych zasad niedziałania -ingerencja. W przypadku zmodyfikowania kopii zapasowej strumienia podczas iteracji
ConcurrentModificationException
zostanie wyrzucony lub może wystąpić niespójny wynik.Czwarte podejście (równoległe
Stream.forEach
) - jak już wspomniano, nie ma gwarancji przestrzegania kolejności spotkań zgodnie z oczekiwaniami w przypadku strumieni równoległych. Możliwe jest, że akcja jest wykonywana w innym wątku dla różnych elementów, co nigdy nie jest możliweforEachOrdered
.Piąty Approach (równolegle
Stream.forEachOrdered
) -forEachOrdered
przetwarza elementy w kolejności określonej przez źródła, niezależnie od tego, czy strumień jest kolejno lub równolegle. Dlatego nie ma sensu używać tego z równoległymi strumieniami.źródło
Lub możesz po prostu użyć narzędzi Apache Commons:
https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ArrayUtils.html#toString-java.lang.Object-
źródło
Użyj
String.join()
na przykład:źródło
Miałem podobne problemy. Mój kod:
Sposób 1: wydrukowanie listy w pętli for
Sposób 2: wydrukowanie listy w pętli forEach, for
Sposób 3: Wydrukuj listę w Javie 8
źródło
Ale jeśli elementy są obiektami, to jak wspomniał Kshitij Mehta, musisz zaimplementować (przesłonić) metodę „toString” w tym obiekcie - jeśli jeszcze nie został zaimplementowany - i pozwolić mu zwrócić coś znaczącego z wnętrza obiektu, przykład:
źródło
System.out.println(list);
pracuje dla mnie.Oto pełny przykład:
Wydrukuje się
[Hello, World]
.źródło
Aby uzyskać listę tablic String
źródło
Napisałem funkcję zrzutu, która zasadniczo drukuje publiczne elementy obiektu, jeśli nie zastąpiło toString (). Można go łatwo rozwinąć, aby wywoływać osoby pobierające. Javadoc:
źródło
Aby pętla wypisała zawartość listy:
Wynik:
Jeśli chcesz drukować w jednym wierszu (tylko dla informacji):
Wynik:
źródło
źródło
x
i jak ma się to do pytania PO?Tak się składa, że pracuję teraz nad tym ...
źródło
Zależy to od rodzaju obiektów przechowywanych w
List
i od tego, czy ma implementację dlatoString()
metody.System.out.println(list)
Należy wydrukować wszystkie standardowe typy obiektów Java (String
,Long
,Integer
etc). W przypadku, gdy używamy niestandardowych typów obiektów, musimyoverride
toString()
zastosować metodę naszego niestandardowego obiektu.Przykład:
Test:
źródło
źródło
spróbuj przesłonić metodę toString (), jeśli chcesz, aby element był drukowany. więc metoda drukowania może być następująca:
źródło
toString
jest niejawne.źródło