我正在寻找一种漂亮的方式来打印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();
但我确信有更优雅和简洁的方法来做到这一点。
或者把你的逻辑变成一个整洁的小班。
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));
注意:您也可以将该逻辑放入实用程序方法中。
你应该能够做你想做的事情:
以System.out.println(map)
为例
只要地图中的所有对象都覆盖了qazxsw poi方法,您就会看到: qazxsw poi以有意义的方式
如果这是为你的代码,当覆盖qazxsw poi是一个好习惯,我建议你去做。
对于你的对象是toString
s的例子,你应该没有别的。
即{key1=value1, key2=value2}
将完全打印您需要的内容而无需任何额外的代码
toString
我想这样的东西会更干净,并为您提供输出格式的更多灵活性(只需更改模板):
String
我知道必须删除最后一个逗号是丑陋的,但我认为它比一个System.out.println(map)
或手动使用迭代器的替代品更清晰。
作为利用现有基础设施的快速而肮脏的解决方案,您可以将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
不完全回答问题,但值得一提的是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
Arrays.toString(map.entrySet().toArray())
看看Guava图书馆:
Joiner.MapJoiner mapJoiner = Joiner.on(",").withKeyValueSeparator("=");
System.out.println(mapJoiner.join(map));
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>
简单易行。欢迎来到JSON世界。使用Google's Gson:
new Gson().toJson(map)
带3个键的地图示例:
{"array":[null,"Some string"],"just string":"Yo","number":999}
当我在类路径中有org.json.JSONObject
时,我会:
Map<String, Object> stats = ...;
System.out.println(new JSONObject(stats).toString(2));
(这个精美的缩进列表,集合和地图可以嵌套)
我更喜欢将地图转换为JSON字符串:
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 "";
}
使用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);
查看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的人没有找到更优雅的方式来做到这一点,那就没有了:-)