2014-11-25 56 views
0

我有这样的方法:如何修改Map的输出风格?

public static void main(String[] args) { 
     Map<String, Long> var = Files.walk(Paths.get("text"), number) 
       .filter(path -> !Files.isDirectory(path)) 
        .map(Path::getFileName) 
        .map(Object::toString) 
        .filter(fileName -> fileName.contains(".")) 
        .map(fileName -> fileName.substring(fileName.lastIndexOf(".") + 1)) 
        .collect(Collectors.groupingBy(
            extension -> extension, 
            Collectors.counting() 
          ) 
        ); 
     System.out.println(var); 
} 

正如我们所知,输出将是这样的:

{text=1, text=2} 

是否有可能输出更改为:

text = 1 
text = 2 

我想有更多的自由,例如, G。去掉括号和逗号,后面加新线等

+0

您可能想要创建一个自定义的Map类,它在'toString()'方法中处理这种打印形式。 – 2014-11-25 01:57:44

回答

1

可以遍历地图的结果,只是打印出来:

for (Map.Entry<String, Long> entry : var.entrySet()) 
{ 
    System.out.println(entry.getKey() + " = " + entry.getValue()); 
} 

然后如果你想要更多的控制,你可以修改线的打印方式,因为你有原始键和值对象。

+0

与试图摆脱类本身的行为相比,这是一个更好的选择,这很可能是脆弱的并且限制了灵活性。 – chrylis 2014-11-25 02:11:58

+0

谢谢,像魅力一样工作。 – JohnDoe 2014-11-25 02:19:33

+0

@chrylis创建子类来完成新事物是面向对象设计概念背后的整体思想。如果你想改变'toString'行为,那么你可以继承和重载'toString'。它对父类的功能或代码没有其他影响。鉴于'Map'是一个接口,不需要更改代码。这样做的答案表明,自由形式违反了面向对象的设计实践,即将属于“Map”的逻辑放在代表“Map”的类之外。 – 2014-11-25 03:21:01

0

什么简单的东西如:

map.toString().replace(", ", "\n"); 
+0

这是部分的,你会得到一个字符串:'“{text = 1 \ ntext = 2}”' – 2014-11-25 02:00:02

+0

是的,但我已经说明了原则。 – Stewart 2014-11-25 09:59:04