2012-04-12 92 views
94

我正在寻找漂亮的方式来漂亮地打印Map在Java中漂亮地打印地图

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

但我相信有一个更优雅和简洁的方式来做到这一点。

+1

可能重复到字符串Java](http://stackoverflow.com/questions/2828252/map-to-string-in-java),因为这里请求的格式和'System.out.println'的格式太接近了。如果你想定制一些东西,这可以归结为“如何迭代Java中的地图”,这当然有许多其他的答案。 – 2015-03-02 10:47:28

回答

50

或者将您的逻辑放到一个整洁的小班。

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

注意:你也可以把这种逻辑成为一个实用的方法。

1

您应该能够从做你想要做什么:

System.out.println(map)例如

只要地图中所有的物体都overiden的toString方法,你会看到:
{key1=value1, key2=value2}在有意义的方式

如果这是为您的代码,然后过于toString是一个很好的习惯,我建议你去那。

对于你的例子,如果你的对象是String s,你应该没问题。
I.e. System.out.println(map)会正确打印您需要的内容而无需任何额外的代码

+1

他的键和值是字符串;我认为他得到了tbh的toString方法。 – Tom 2012-04-12 08:53:44

+0

你是对的,但也许他复制了一个微不足道的例子来表达他的观点。但我更新了答案 – Cratylus 2012-04-12 08:54:27

+0

是的,我应该指出我的地图是Map 。 但我也表示,我希望在我的输入值中有更多的自由,例如在条目的值中使用逗号分隔的列表。所以Map.toString()不会。 – 2012-04-12 08:58:36

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

,但我认为它比诸如in this solution之类的替代品更清洁,或者手动使用迭代器。

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的家伙并没有找到一个更优雅的方式来做到这一点的,没有:-)

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

看一看的番石榴库:

Joiner.MapJoiner mapJoiner = Joiner.on(",").withKeyValueSeparator("="); 
System.out.println(mapJoiner.join(map)); 
221
Arrays.toString(map.entrySet().toArray()) 
+5

哇....惊人的简单和工作的解决方案...谢谢 – 2015-11-16 11:18:34

+6

如果你有'Map >'不太好,那么你会得到这种类型的sting:'[ test = {test = [D @ 3995ebd8,2 = [D @ 26fa5067,3 = [D @ 1d956d37,4 = [D @ 2cead81,5 = [D @ 14934d2b} ...]' – zygimantus 2016-01-16 13:23:31

+4

工作就像一个黑魔法! – 2016-02-28 08:28:29

24

Apache库来救援!

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

所有你需要Apache公地集合库(project link

Maven用户可以使用这种依赖关系添加库:

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

这不处理数组作为映射的值(例如'Map ')。只有他们的className和散列被打印而不是实际的值。 – 2016-10-19 08:49:58

8

当我在classpath org.json.JSONObject,我做的:

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

(这个漂亮的缩进列表,设置一个nd可嵌套的地图)

6

简单而容易。欢迎来到JSON世界。使用Google's Gson:地图

new Gson().toJson(map) 

例3个键:

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

使用Java 8流:

Map<Object, Object> map = new HashMap<>(); 

String content = map.entrySet() 
        .stream() 
        .map(e -> e.getKey() + "=\"" + e.getValue() + "\"") 
        .collect(Collectors.joining(", ")); 

System.out.println(content); 
+0

如果你打算去问一个问题,至少应该正确回答!你错过了值的引号,它应该用','连接起来 – AjahnCharles 2017-09-14 15:29:53

2

我喜欢把地图转换成JSON字符串,它是:

  • a标准
  • 人类可读
  • 支持一样崇高,VS代码编辑器,语法 突出显示,格式化和部分隐藏/显示
  • 支持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 ""; 
    }