用Java打印地图

spa*_*key 130 java dictionary pretty-print

我正在寻找一种漂亮的印刷方式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();
Run Code Online (Sandbox Code Playgroud)

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

Ark*_*ski 295

Arrays.toString(map.entrySet().toArray())
Run Code Online (Sandbox Code Playgroud)

  • 如果你有`Map <String,Map <String,double [] >>`那就不太好了,那么你会得到这种类型的刺痛:`[test = {test = [D @ 3995ebd8,2 = [D @ 26fa5067] ,3 = [D @ 1d956d37,4 = [D @ 2cead81,5 = [D @ 14934d2b} ...]` (10认同)
  • 这应该是公认的答案。像这样的简单任务不应该需要外部依赖。如上所述,更复杂的地图不会因此而轻易受益。 (3认同)

小智 68

看看Guava图书馆:

Joiner.MapJoiner mapJoiner = Joiner.on(",").withKeyValueSeparator("=");
System.out.println(mapJoiner.join(map));
Run Code Online (Sandbox Code Playgroud)


ada*_*shr 60

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

System.out.println(new PrettyPrintingMap<String, String>(myMap));
Run Code Online (Sandbox Code Playgroud)

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

  • 恕我直言,这是一个反模式。您为您的类型添加了强大的约束(继承),只是为了一些小小的好处(漂亮的打印)。您最好使用常规映射,但使用将其作为参数的静态方法。 (4认同)

tbr*_*aun 31

Apache库来救援!

MapUtils.debugPrint(System.out, "myMap", map);
Run Code Online (Sandbox Code Playgroud)

所有你需要的Apache commons-collections库(项目链接)

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

<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • MapUtils.verbosePrint 也很方便,它将在 debugPrint 输出的每个值后面省略类名。 (2认同)

Ali*_*aka 15

简单易行.欢迎来到JSON世界.使用谷歌的Gson:

new Gson().toJson(map)
Run Code Online (Sandbox Code Playgroud)

带3个键的地图示例:

{"array":[null,"Some string"],"just string":"Yo","number":999}
Run Code Online (Sandbox Code Playgroud)

  • 您还可以通过将 setPrettyPrinting() 添加到 GsonBuilder 来添加良好的缩进: new GsonBuilder().setPrettyPrinting().create() (2认同)

Tha*_*wda 13

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

Map<String, Object> stats = ...;
System.out.println(new JSONObject(stats).toString(2));
Run Code Online (Sandbox Code Playgroud)

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

  • 男人!!你在这里做什么?你应该是最佳答案! (3认同)

Nik*_*rov 7

使用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);
Run Code Online (Sandbox Code Playgroud)

  • 如果你要问一个问题,至少应该正确回答!你错过了值周围的引号,它应该使用`,`连接 (2认同)

Mat*_*ttG 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 "";
    }
    
    Run Code Online (Sandbox Code Playgroud)