150

私はきれいに印刷するための良い方法を探していMapます。

map.toString()私に与える:{key1=value1, key2=value2, key3=value3}

マップエントリ値の自由度を高めたいので、次のようなものを探しています。key1="value1", key2="value2", key3="value3"

私はこの小さなコードを書きました:

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();

しかし、これを行うにはもっとエレガントで簡潔な方法があると確信しています。

4

16 に答える 16

75

Guava ライブラリをご覧ください。

Joiner.MapJoiner mapJoiner = Joiner.on(",").withKeyValueSeparator("=");
System.out.println(mapJoiner.join(map));
于 2013-10-15T12:03:49.220 に答える
65

または、ロジックをきちんとした小さなクラスに入れます。

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();

    }
}

使用法:

Map<String, String> myMap = new HashMap<String, String>();

System.out.println(new PrettyPrintingMap<String, String>(myMap));

注:そのロジックをユーティリティメソッドに入れることもできます。

于 2012-04-12T08:57:13.157 に答える
20

org.json.JSONObjectクラスパスにいるときは、次のようにします。

Map<String, Object> stats = ...;
System.out.println(new JSONObject(stats).toString(2));

(これにより、ネストされたリスト、セット、およびマップが美しくインデントされます)

于 2015-06-05T06:28:47.517 に答える
4

HashMap#toString()およびAbstractMap#toString()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(", ");
        }
    }
}

したがって、OpenJDK の人たちがこれを行うためのよりエレガントな方法を見つけられなかった場合、何もありません :-)

于 2012-04-12T09:05:56.317 に答える
3

次のことを行うことで、やりたいことができるはずです。

System.out.println(map)例えば

マップ内のすべてのオブジェクトが、意味のある方法でtoString表示されるメソッドを上書きしている限り、
{key1=value1, key2=value2}

これがあなたのコードのためであるならば、それからオーバーライドtoStringすることは良い習慣です、そして私はあなたが代わりにそれのために行くことを提案します。

オブジェクトがStringsである例では、他に何もなければ問題ありません。
つまり、余分System.out.println(map)なコードなしで必要なものを正確に印刷します

于 2012-04-12T08:52:35.423 に答える
2
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);
}
于 2013-01-26T19:36:00.140 に答える
1

Java 8以降、Lambdaで簡単に行う方法があります:

yourMap.keySet().forEach(key -> {
    Object obj = yourMap.get(key);
    System.out.println( obj);
}
于 2020-04-19T09:56:04.587 に答える
1

String result = objectMapper.writeValueAsString(map)- これと同じくらい簡単です!

結果:

{"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 は、Jackson JSON をクラスパスに追加します。

于 2019-07-04T13:57:13.470 に答える
0

このようなものの方がクリーンで、出力形式の柔軟性が向上すると思います(テンプレートを変更するだけです)。

    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();

最後のコンマを削除しなければならないのは醜いことは知っていますが、このソリューションのような代替手段や手動でイテレーターを使用するよりもクリーンだと思います。

于 2012-04-12T09:00:14.040 に答える
0

既存のインフラストラクチャを活用する手っ取り早いソリューションとして、 を にラップuglyPrintedMapしてjava.util.HashMapから を使用できますtoString()

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
于 2013-09-26T10:47:02.853 に答える