用Java打印地图

问题描述 投票:125回答:14

我正在寻找一种漂亮的方式来打印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();

但我确信有更优雅和简洁的方法来做到这一点。

java dictionary pretty-print
14个回答
57
投票

或者把你的逻辑变成一个整洁的小班。

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

注意:您也可以将该逻辑放入实用程序方法中。


2
投票

你应该能够做你想做的事情:

System.out.println(map)为例

只要地图中的所有对象都覆盖了qazxsw poi方法,您就会看到: qazxsw poi以有意义的方式

如果这是为你的代码,当覆盖qazxsw poi是一个好习惯,我建议你去做。

对于你的对象是toStrings的例子,你应该没有别的。 即{key1=value1, key2=value2}将完全打印您需要的内容而无需任何额外的代码


2
投票
toString

0
投票

我想这样的东西会更干净,并为您提供输出格式的更多灵活性(只需更改模板):

String

我知道必须删除最后一个逗号是丑陋的,但我认为它比一个System.out.println(map)或手动使用迭代器的替代品更清晰。


0
投票

作为利用现有基础设施的快速而肮脏的解决方案,您可以将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); } 包装成 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(); ,然后使用in this solution

uglyPrintedMap

0
投票

不完全回答问题,但值得一提的是Lombodok 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 注释@ToString类,那么做annotation将返回一些有意义的东西。

它也适用于地图地图,例如:@ToString将打印为

key / value


279
投票
Arrays.toString(map.entrySet().toArray())

67
投票

看看Guava图书馆:

Joiner.MapJoiner mapJoiner = Joiner.on(",").withKeyValueSeparator("=");
System.out.println(mapJoiner.join(map));

30
投票

Apache库来救援!

MapUtils.debugPrint(System.out, "myMap", map);

所有你需要的Apache commons-collections库(project link

Maven用户可以使用此依赖项添加库:

<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
</dependency>

15
投票

简单易行。欢迎来到JSON世界。使用Google's Gson

new Gson().toJson(map)

带3个键的地图示例:

{"array":[null,"Some string"],"just string":"Yo","number":999}

12
投票

当我在类路径中有org.json.JSONObject时,我会:

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

(这个精美的缩进列表,集合和地图可以嵌套)


7
投票

我更喜欢将地图转换为JSON字符串:

  • 一个标准
  • 人类可读
  • Sublime,VS Code等编辑器支持语法高亮,格式化和部分隐藏/显示
  • 支持JPath,因此编辑器可以准确报告您导航到的对象的哪个部分
  • 支持对象中的嵌套复杂类型 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 ""; }

6
投票

使用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);

4
投票

查看OpenJDK源代码中HashMap#toString()AbstractMap#toString()的代码:

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的人没有找到更优雅的方式来做到这一点,那就没有了:-)

© www.soinside.com 2019 - 2024. All rights reserved.