Saya mencari cara yang bagus untuk mencetak cantik a Map
.
map.toString()
beri saya: {key1=value1, key2=value2, key3=value3}
Saya ingin lebih banyak kebebasan dalam nilai entri peta saya dan saya mencari sesuatu yang lebih seperti ini: key1="value1", key2="value2", key3="value3"
Saya menulis kode kecil ini:
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();
Tapi saya yakin ada cara yang lebih elegan dan ringkas untuk melakukan ini.
java
dictionary
pretty-print
space_monkey
sumber
sumber
System.out.println
yang terlalu mirip. Dan jika Anda menginginkan sesuatu yang unik, intinya adalah "cara mengulang peta di Jawa" yang tentunya memiliki banyak jawaban lain.Jawaban:
Atau masukkan logika Anda ke dalam kelas kecil yang rapi.
public class PrettyPrintingMap<K, V> { private Map<K, V> map; public PrettyPrintingMap(Map<K, V> map) { this.map = map; } public String toString() { StringBuilder sb = new StringBuilder(); Iterator<Entry<K, V>> iter = map.entrySet().iterator(); while (iter.hasNext()) { Entry<K, V> 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(); } }
Pemakaian:
Map<String, String> myMap = new HashMap<String, String>(); System.out.println(new PrettyPrintingMap<String, String>(myMap));
Catatan: Anda juga dapat memasukkan logika tersebut ke dalam metode utilitas.
sumber
sumber
Map<String, Map<String,double[]>>
, maka Anda akan mendapatkan sengatan jenis ini:[test={test=[D@3995ebd8, 2=[D@26fa5067, 3=[D@1d956d37, 4=[D@2cead81, 5=[D@14934d2b}...]
Silakan lihat di perpustakaan Jambu Biji:
Joiner.MapJoiner mapJoiner = Joiner.on(",").withKeyValueSeparator("="); System.out.println(mapJoiner.join(map));
sumber
Perpustakaan Apache untuk menyelamatkan!
MapUtils.debugPrint(System.out, "myMap", map);
Semua yang Anda butuhkan pustaka Apache commons-collections ( tautan proyek )
Pengguna Maven dapat menambahkan pustaka menggunakan ketergantungan ini:
<dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency>
sumber
Map<String, String[]>
). Hanya className dan hash mereka yang dicetak, bukan nilai sebenarnya.Ketika saya
org.json.JSONObject
berada di classpath, saya melakukan:Map<String, Object> stats = ...; System.out.println(new JSONObject(stats).toString(2));
(ini dengan indah mengindentasi daftar, set, dan peta yang mungkin bersarang)
sumber
Sederhana dan mudah. Selamat datang di dunia JSON. Menggunakan Google Gson :
new Gson().toJson(map)
Contoh peta dengan 3 kunci:
{"array":[null,"Some string"],"just string":"Yo","number":999}
sumber
Menggunakan Java 8 Streams:
Map<Object, Object> map = new HashMap<>(); String content = map.entrySet() .stream() .map(e -> e.getKey() + "=\"" + e.getValue() + "\"") .collect(Collectors.joining(", ")); System.out.println(content);
sumber
,
Saya lebih suka mengonversi peta menjadi string JSON sebagai berikut:
mendukung tipe kompleks bersarang di dalam objek
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public static String getAsFormattedJsonString(Object object) { ObjectMapper mapper = new ObjectMapper(); try { return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object); } catch (JsonProcessingException e) { e.printStackTrace(); } return ""; }
sumber
Lihat kode untuk
HashMap#toString()
danAbstractMap#toString()
di sumber OpenJDK:class java.util.HashMap.Entry<K,V> implements Map.Entry<K,V> { public final String toString() { return getKey() + "=" + getValue(); } } class java.util.AbstractMap<K,V> { public String toString() { Iterator<Entry<K,V>> i = entrySet().iterator(); if (! i.hasNext()) return "{}"; StringBuilder sb = new StringBuilder(); sb.append('{'); for (;;) { Entry<K,V> e = i.next(); K key = e.getKey(); V value = e.getValue(); sb.append(key == this ? "(this Map)" : key); sb.append('='); sb.append(value == this ? "(this Map)" : value); if (! i.hasNext()) return sb.append('}').toString(); sb.append(", "); } } }
Jadi jika orang-orang dari OpenJDK tidak menemukan cara yang lebih elegan untuk melakukan ini, tidak ada :-)
sumber
Anda harus dapat melakukan apa yang Anda inginkan dengan melakukan:
System.out.println(map)
sebagai contohSelama SEMUA objek Anda di peta telah memperluas
toString
metode yang akan Anda lihat:{key1=value1, key2=value2}
dengan cara yang bermaknaJika ini untuk kode Anda, maka overiding
toString
adalah kebiasaan yang baik dan saya sarankan Anda melakukannya sebagai gantinya.Untuk contoh Anda di mana objek Anda berada
String
, Anda seharusnya baik-baik saja tanpa hal lain.Yaitu
System.out.println(map)
akan mencetak apa yang Anda butuhkan tanpa kode tambahansumber
java.util.Map
tidak memiliki kontrak terkaittoString()
, jadi terserah padaMap
implementasi sebenarnya apa yang akan terjadiSystem.out.println(map)
->PrintStream.println(map)
->String.valueOf(map)
->map.toString()
. Kebetulan yang sering digunakanjava.util.AbstractMap
menyediakan representasi string yang bagus untuktoString()
. ...Map
Penerapan lain mungkin jatuh kembali keObject.toString()
, yang menghasilkan tidak terlalu informatifcom.example.MyMap@4e8c0de
.public void printMapV2 (Map <?, ?> map) { StringBuilder sb = new StringBuilder(128); sb.append("{"); for (Map.Entry<?,?> entry : map.entrySet()) { if (sb.length()>1) { sb.append(", "); } sb.append(entry.getKey()).append("=").append(entry.getValue()); } sb.append("}"); System.out.println(sb); }
sumber
String result = objectMapper.writeValueAsString(map)
- sesederhana ini!Hasil:
{"2019-07-04T03:00":1,"2019-07-04T04:00":1,"2019-07-04T01:00":1,"2019-07-04T02:00":1,"2019-07-04T13:00":1,"2019-07-04T06:00":1 ...}
PS menambahkan Jackson JSON ke jalur kelas Anda.
sumber
Saya kira sesuatu seperti ini akan lebih bersih, dan memberi Anda lebih banyak fleksibilitas dengan format output (cukup ubah template):
String template = "%s=\"%s\","; StringBuilder sb = new StringBuilder(); for (Entry e : map.entrySet()) { sb.append(String.format(template, e.getKey(), e.getValue())); } if (sb.length() > 0) { sb.deleteCharAt(sb.length() - 1); // Ugly way to remove the last comma } return sb.toString();
Saya tahu harus menghapus koma terakhir itu jelek, tapi saya pikir itu lebih bersih daripada alternatif seperti yang ada dalam solusi ini atau secara manual menggunakan iterator.
sumber
Sebagai solusi cepat dan kotor yang memanfaatkan infrastruktur yang ada, Anda dapat membungkus Anda
uglyPrintedMap
menjadijava.util.HashMap
, lalu gunakantoString()
.uglyPrintedMap.toString(); // ugly System.out.println( uglyPrintedMap ); // prints in an ugly manner new HashMap<Object, Object>(jobDataMap).toString(); // pretty System.out.println( new HashMap<Object, Object>(uglyPrintedMap) ); // prints in a pretty manner
sumber
Tidak menjawab pertanyaan dengan tepat, tetapi
@ToString
penjelasan Lombodok patut disebutkan . Jika Anda membubuhi keterangan dengan@ToString
yangkey / value
kelas, kemudian melakukanSystem.out.println(map)
akan sesuatu yang berarti.Ini juga bekerja sangat baik dengan maps-of-maps, misalnya:
Map<MyKeyClass, Map<String, MyValueClass>>
akan dicetak sebagai{MyKeyClass(properties...)={string1=MyValuesClass(properties...), string2=MyValuesCalss(properties...),..}, ... }
sumber
Sejak java 8 ada cara mudah untuk melakukannya dengan Lambda:
sumber