Chcę wydrukować Stack<Integer>
obiekt tak ładnie, jak robi to debugger Eclipse (tj. [1,2,3...]
), Ale wydrukowanie go za pomocą out = "output:" + stack
nie zwraca tego miłego wyniku.
Dla wyjaśnienia mówię o wbudowanej kolekcji Java, więc nie mogę jej zastąpić toString()
.
Jak mogę uzyskać ładną wersję stosu do wydruku?
java
debugging
pretty-print
Elazar Leibovich
źródło
źródło
AbstractCollection@toString
(i tym samymString + Stack
) już drukuje go tak, jak chcesz.Odpowiedzi:
Możesz przekonwertować go na tablicę, a następnie wydrukować to za pomocą
Arrays.toString(Object[])
:źródło
stack.toArray()
mogą być bardzo drogie, jeśli chodzi o procesor, czas i pamięć. rozwiązanie, które iteruje w stosunku do oryginalnej kolekcji / iterowalnej, prawdopodobnie zużywałoby mniej zasobów.(Java 8)
źródło
yourCollection.stream().map( o -> o.toString() ).collect( joining(",") ))
jest lepszy, ponieważ czytasz go od lewej do prawej, nie musisz patrzeć wstecz na przód, aby obliczyć w mózgu, co się dzieje z listą pośredniąDzięki strumieniom i kolektorom Java 8 można to łatwo zrobić:
najpierw używamy
map
zObject::toString
do tworzenia,Collection<String>
a następnie używamy łączenia kolekcjonera, aby łączyć każdy element w kolekcji,
jako separator.źródło
Collections.toString(stack)
byłoby łatwe.Klasa MapUtils oferowana przez projekt Apache Commons oferuje
MapUtils.debugPrint
metodę, która całkiem wydrukuje twoją mapę.źródło
System.out.println (kolekcja c) już drukuje dowolny typ kolekcji w czytelnym formacie. Tylko jeśli kolekcja zawiera obiekty zdefiniowane przez użytkownika, należy zaimplementować metodę toString () w klasie zdefiniowanej przez użytkownika, aby wyświetlić zawartość.
źródło
Zaimplementuj toString () w klasie.
Polecam Apache Commons ToStringBuilder, aby to ułatwić. Dzięki temu wystarczy napisać ten rodzaj metody:
Aby uzyskać tego rodzaju dane wyjściowe:
Istnieje również refleksyjne wdrożenie .
źródło
Guawa wygląda na dobrą opcję:
Iterables.toString(myIterable)
źródło
Zgadzam się z powyższymi komentarzami na temat przesłonięcia
toString()
własnych klas (i na temat automatyzacji tego procesu w jak największym stopniu).W przypadku klas, których nie zdefiniowałeś, możesz napisać
ToStringHelper
klasę z przeciążoną metodą dla każdej klasy biblioteki, którą chcesz obsługiwać według własnych upodobań:EDYCJA: Odpowiadając na komentarz xukxpvfzflbbld, oto możliwe wdrożenie dla wyżej wymienionych przypadków.
To nie jest pełna implementacja, ale tylko starter.
źródło
Możesz użyć klasy „Objects” z JAVA (która jest dostępna od 1.7)
Wyjście: 1273, 123, 876, 897
Inną możliwością jest użycie klasy „MoreObjects” od Google Guave , która zapewnia wiele przydatnych funkcji pomocniczych:
Dane wyjściowe: NameOfYourObject = [1273, 123, 876, 897]
Dokumenty Guava
źródło
Objects.toString()
po prostu wywołujetoString()
kolekcję. W twoim przykładzie działa to, ponieważ przypuszczalnietoString()
w kolekcji wspieranej macierzą zdarza się ładnie wydrukować.Z Apache Commons 3 chcesz zadzwonić
źródło
W Javie 8
lub
źródło
Właśnie zmodyfikowałem poprzedni przykład, aby wydrukować nawet kolekcję zawierającą obiekty zdefiniowane przez użytkownika.
źródło
obecnie większość kolekcji jest przydatna
toString()
w Javie (Java 7/8). Nie ma więc potrzeby wykonywania operacji strumieniowych w celu konkatenacji tego, czego potrzebujesz, wystarczy zastąpićtoString
klasę wartości w kolekcji i uzyskać to, czego potrzebujesz.zarówno AbstractMap, jak i AbstractCollection implementują toString (), wywołując toString dla każdego elementu.
poniżej znajduje się klasa testowa pokazująca zachowanie.
źródło
JSON
Alternatywnym rozwiązaniem może być konwersja kolekcji w formacie JSON i wydrukowanie ciągu Json. Zaletą jest dobrze sformatowany i czytelny ciąg obiektowy bez potrzeby implementowania
toString()
.Przykład korzystania z Google Gson :
źródło
Jeśli jest to Twoja własna klasa kolekcji, a nie wbudowana, musisz przesłonić jej metodę toString. Eclipse wywołuje tę funkcję dla wszystkich obiektów, dla których nie ma wbudowanego formatowania.
źródło
Zachowaj ostrożność, dzwoniąc do Sop na Collection, może rzucić
ConcurrentModification
wyjątek. Ponieważ wewnętrznietoString
metoda każdej kolekcji wywołuje wewnętrznieIterator
kolekcję.źródło
Powinien działać z każdą kolekcją oprócz
Map
, ale jest również łatwy do obsługi. W razie potrzeby zmodyfikuj kod, aby przekazać te 3 znaki jako argumenty.źródło
Możesz spróbować użyć
źródło
Istnieją dwa sposoby uproszczenia pracy. 1. zaimportuj bibliotekę Gson. 2. użyj Lombok.
Oba z nich pomagają stworzyć String z instancji obiektu. Gson parsuje twój obiekt, lombok zastąpi twój obiekt klasy na metodę Strings.
Podaję przykład Gson prettyPrint, tworzę klasę pomocniczą do drukowania obiektów i kolekcji obiektów. Jeśli używasz lombok, możesz oznaczyć swoją klasę jako @ToString i wydrukować swój obiekt bezpośrednio.
}
źródło