2014-11-25 46 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