Szukam ładnego sposobu na ładne wydrukowanie pliku Map
.
map.toString()
daje mi: {key1=value1, key2=value2, key3=value3}
Chcę większej swobody w wartościach wpisu mapy i szukam czegoś bardziej podobnego: key1="value1", key2="value2", key3="value3"
Napisałem ten mały fragment kodu:
StringBuilder sb = new StringBuilder();
Iterator<Entry<String, String>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Entry<String, String> entry = iter.next();
sb.append(entry.getKey());
sb.append('=').append('"');
sb.append(entry.getValue());
sb.append('"');
if (iter.hasNext()) {
sb.append(',').append(' ');
}
}
return sb.toString();
Ale jestem pewien, że istnieje bardziej elegancki i zwięzły sposób, aby to zrobić.
java
dictionary
pretty-print
space_monkey
źródło
źródło
System.out.println
są zbyt zbliżone. A jeśli chcesz czegoś niestandardowego, sprowadza się to do „jak iterować mapę w Javie”, co z pewnością ma wiele innych odpowiedzi.Odpowiedzi:
Lub umieść swoją logikę w uporządkowanej małej klasie.
Stosowanie:
Uwaga: Możesz również umieścić tę logikę w metodzie narzędziowej.
źródło
źródło
Map<String, Map<String,double[]>>
, to dostaniesz tego typu żądło:[test={test=[D@3995ebd8, 2=[D@26fa5067, 3=[D@1d956d37, 4=[D@2cead81, 5=[D@14934d2b}...]
Zajrzyj do biblioteki Guava:
źródło
Biblioteki Apache na ratunek!
Wszystko, czego potrzebujesz biblioteka Apache commons-collections ( link do projektu )
Użytkownicy Mavena mogą dodać bibliotekę przy użyciu tej zależności:
źródło
Map<String, String[]>
). Zamiast rzeczywistych wartości drukowane są tylko ich nazwa klasy i skrót.Proste i łatwe. Witamy w świecie JSON. Korzystanie z Google's Gson :
Przykład mapy z 3 klawiszami:
źródło
Kiedy mam
org.json.JSONObject
w ścieżce klas, robię:(to pięknie wcina listy, zbiory i mapy, które mogą być zagnieżdżane)
źródło
Korzystanie ze strumieni Java 8:
źródło
,
Wolę przekonwertować mapę na ciąg JSON, jest to:
obsługuje zagnieżdżone typy złożone w obiekcie
źródło
Spójrz na kod dla
HashMap#toString()
iAbstractMap#toString()
w źródłach OpenJDK:Jeśli więc chłopaki z OpenJDK nie znaleźli na to bardziej eleganckiego sposobu, to nie ma :-)
źródło
Powinieneś być w stanie robić, co chcesz, robiąc:
System.out.println(map)
na przykładTak długo, jak WSZYSTKIE twoje obiekty na mapie przesłoniły
toString
metodę, którą zobaczysz:{key1=value1, key2=value2}
w znaczący sposóbJeśli to jest dla twojego kodu, to przesadzanie
toString
jest dobrym nawykiem i sugeruję, abyś zamiast tego wybrał to.Na przykład, gdzie twoje obiekty są
String
s, powinno być dobrze bez niczego innego.Czyli
System.out.println(map)
będzie drukować dokładnie to, czego potrzebujesz, bez żadnego dodatkowego koduźródło
java.util.Map
nie jest objęty żadną umowątoString()
, więc od rzeczywistejMap
implementacji zależy, coSystem.out.println(map)
->PrintStream.println(map)
->String.valueOf(map)
->map.toString()
spowoduje. Zdarza się, że często używanyjava.util.AbstractMap
zapewnia ładną reprezentację ciągutoString()
. ... InneMap
implementacje mogą wrócić doObject.toString()
, co skutkuje brakiem informacjicom.example.MyMap@4e8c0de
.źródło
Wydaje mi się, że coś takiego byłoby bardziej przejrzyste i zapewniłoby większą elastyczność dzięki formatowi wyjściowemu (po prostu zmień szablon):
Wiem, że usunięcie ostatniego przecinka jest brzydkie, ale myślę, że jest to czystsze niż alternatywy, takie jak ta w tym rozwiązaniu lub ręcznie za pomocą iteratora.
źródło
Jako szybkie i brudne rozwiązanie wykorzystujące istniejącą infrastrukturę, możesz opakować je
uglyPrintedMap
w plikjava.util.HashMap
, a następnie użyćtoString()
.źródło
Nie odpowiada dokładnie na pytanie, ale warto wspomnieć o
@ToString
adnotacji Lombodok . Jeśli dodasz adnotacje@ToString
dokey / value
klas, działanieSystem.out.println(map)
zwróci coś znaczącego.Działa również bardzo dobrze z mapami map, na przykład:
Map<MyKeyClass, Map<String, MyValueClass>>
zostaną wydrukowane jako{MyKeyClass(properties...)={string1=MyValuesClass(properties...), string2=MyValuesCalss(properties...),..}, ... }
źródło
String result = objectMapper.writeValueAsString(map)
- takie proste!Wynik:
PS dodaj Jackson JSON do swojej ścieżki klas.
źródło
Od Java 8 można to łatwo zrobić z Lambda:
źródło