2016-01-05 137 views
2

我有一個LinkedHashMap如何在filter()java8中使用peek()?

sorted:{0=[1, 2], 5=[4, 3], 1=[2, 0, 3], 2=[4, 0, 1], 3=[4, 5, 1], 4=[5, 2, 3]} 

我試着根據其大小過濾每個鍵的值。例如,對於入門2=[4, 0, 1],我需要過濾的值使得按鍵應該只有值的大小大於或等於(>=)它

考慮2=[4, 1]:因爲0只有兩個元素,我們將其刪除。 4和1有三個元素等於2的大小,所以我們保留它。

最終的輸出應該是:

nodes_withHighDegreee :{0=[1, 2], 5=[4, 3], 1=[2, 3], 2=[4, 1], 3=[4, 1], 4=[2, 3]} 

我想:

Map<Integer, List<Integer>> nodes_withHighDegree = sorted.entrySet().stream() 
       .peek(e -> e.getValue().filter((a,b)-> map.get(a).size() >= map.get(b).size())) 
       .collect(LinkedHashMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), (m0, m1) -> m0.putAll(m1)); 
System.out.println("After sort" + nodes_withHighDegree); 

如何在這裏使用過濾功能?

+0

請注意,一次通過將不夠。由於鍵中元素的數量可能會減少,因此您必須再次檢查。 –

+1

@tobias_k我猜計數應該基於初始地圖​​。 – Tunaki

+2

@tobias_k我不認爲你明白這裏提到的是什麼。也許OP可以澄清,但我的理解是:讓我們以長度爲3的'4 = [5,2,3]'爲例。在初始映射中,'5'與長度爲'2'的列表關聯,所以我們刪除它('2 <3');那麼'2'與一個長度爲'3'的列表相關聯,所以我們保留它('3> = 3')等。 – Tunaki

回答

6

你可以很簡單地使用Map.replaceAll。假設數據是稱爲sortedLinkedHashMap內:

Map<Integer, List<Integer>> filtered = new LinkedHashMap<>(sorted); 
filtered.replaceAll((k, v) -> v.stream() 
           .filter(i -> sorted.get(i).size() >= v.size()) 
           .collect(Collectors.toList())); 

輸出:

{0=[1, 2], 5=[4, 3], 1=[2, 3], 2=[4, 1], 3=[4, 1], 4=[2, 3]} 

此代碼創建的映射的副本以保持過濾實例。然後它通過過濾它來替換每個值,只保留其數目比當前計數值大的整數。


在你現在的做法,您使用peek修改這是壞的實踐價值。從API note報價:

這種方法主要存在於支持調試,您希望看到的元素,因爲他們流過某一點的管道。

+0

非常感謝:)是否有任何教程來學習流功能?我找不到合適的材料。 – priya

+1

@priya Oracle已經發布了[在線turials](https://docs.oracle.com/javase/tutorial/collections/streams/index.html),您可以關注。使用API​​並閱讀文檔本身對於學習也很有用。 – Tunaki

+1

@priya:[Are](http://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#package.description)[you](http:// docs.oracle.com/javase/8/docs/api/?java/util/stream/Stream。html)[開玩笑](http://docs.oracle.com/javase/tutorial/collections/streams/)? – Holger