![](/img/trans.png)
[英]Transforming a Map in Java using Java 8 Streams - Segregating Map based on the Value of the Map
[英]Segregating a Map in two map based on value in Groovy or java
我有一個 Map<Object,ArrayList> MapA 類型的 map。 map 可以具有如下值
MapA
{key=0003bb2d-f3cf-4b5c-9f34 , value = ["12345","Complete","5431"],
key=0003bb2d-f3cf-4b5c-9f71 , value = ["2311","InComplete","5321"],
key=0003bb2d-f3cf-4b5c-1d71 , value = ["4567","InComplete","4321"],
key=0003bb2d-f3cf-4b5c-1r51 , value = ["2345","Complete","5432"]}
output should be
MapA
{key=0003bb2d-f3cf-4b5c-9f34 , value = ["12345","Complete","5431"],
key=0003bb2d-f3cf-4b5c-1r51 , value = ["2345","Complete","5432"]}
MapB
{key=0003bb2d-f3cf-4b5c-9f71 , value = ["2311","InComplete","5321"],
key=0003bb2d-f3cf-4b5c-1d71 , value = ["4567","InComplete","4321"]}
我想從包含所有鍵值對的 MapA 創建一個新的 MapB,其中 value 中包含“InComplete”。 我可以有兩個額外的 map 具有“完整”和“不完整”鍵值對,或者如果我可以從 MapA 中刪除不完整。
所以我想根據 Complete 或 InComplete 將 MapA 分離成兩個單獨的地圖。
我需要將它寫在 groovy 但如果我也能在 java 8 中得到一些提示,我可以嘗試轉換它。
我正在處理的代碼片段,但這將創建新的 Map 但不會從 MapA 中刪除這些值,我該怎么做?
MapA.entrySet().stream().filter(entry->entry.getValue().get(1).equals("InComplete")).collect(Collectors.toMap())
感謝你的幫助
更新
def mapB = [:].withDefault {key -> return []}
Iterator<Map.Entry<Object, ArrayList>> iterator = mapA.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Object, ArrayList> entry = iterator.next();
if(entry.getValue().get(1).equals("InComplete")) {
mapB.put(entry.getKey(), entry.getValue())
iterator.remove()
}
}
有成千上萬種方法可以做到這一點。
下面我放了 3 個選項:1 個在 2 個循環中獨立填充 2 個地圖,1 個(性能稍好)使用單循環,1 個使用groupBy
:
def map = [ '0003bb2d-f3cf-4b5c-9f34':["12345","Complete","5431"],
'0003bb2d-f3cf-4b5c-9f71':["2311","InComplete","5321"],
'0003bb2d-f3cf-4b5c-1d71':["4567","InComplete","4321"],
'0003bb2d-f3cf-4b5c-1r51':["2345","Complete","5432"]]
// 1. option
Map complete = map.findAll{ k, v -> 'Complete' == v[ 1 ] }
Map inComplete = map.findAll{ k, v -> 'InComplete' in v }
assert complete.toString() == '[0003bb2d-f3cf-4b5c-9f34:[12345, Complete, 5431], 0003bb2d-f3cf-4b5c-1r51:[2345, Complete, 5432]]'
assert inComplete.toString() == '[0003bb2d-f3cf-4b5c-9f71:[2311, InComplete, 5321], 0003bb2d-f3cf-4b5c-1d71:[4567, InComplete, 4321]]'
// 2. option
def twoMaps = map.inject( [:].withDefault{ [:] } ){ res, curr ->
res[ curr.value[ 1 ] ] << curr
res
}
assert twoMaps.toString() == '[Complete:[0003bb2d-f3cf-4b5c-9f34:[12345, Complete, 5431], 0003bb2d-f3cf-4b5c-1r51:[2345, Complete, 5432]], InComplete:[0003bb2d-f3cf-4b5c-9f71:[2311, InComplete, 5321], 0003bb2d-f3cf-4b5c-1d71:[4567, InComplete, 4321]]]'
// 3. option -> credits to @tim_yates!
def groupMaps = map.groupBy{ it.value[ 1 ] }
assert groupMaps.toString() == '[Complete:[0003bb2d-f3cf-4b5c-9f34:[12345, Complete, 5431], 0003bb2d-f3cf-4b5c-1r51:[2345, Complete, 5432]], InComplete:[0003bb2d-f3cf-4b5c-9f71:[2311, InComplete, 5321], 0003bb2d-f3cf-4b5c-1d71:[4567, InComplete, 4321]]]'
為了好玩,這是相同的,但在 Java 17
var stringListMap = Map.of(
"0003bb2d-f3cf-4b5c-9f34", List.of("12345", "Complete", "5431"),
"0003bb2d-f3cf-4b5c-9f71", List.of("2311", "InComplete", "5321"),
"0003bb2d-f3cf-4b5c-1d71", List.of("4567", "InComplete", "4321"),
"0003bb2d-f3cf-4b5c-1r51", List.of("2345", "Complete", "5432")
);
var result = stringListMap.entrySet().stream().collect(
Collectors.groupingBy(
e -> e.getValue().get(1),
Collectors.mapping(e -> e, Collectors.toList())
)
);
result.forEach((k, v) -> System.out.println(k + " => " + v));
哪個打印:
Complete => [0003bb2d-f3cf-4b5c-9f34=[12345, Complete, 5431], 0003bb2d-f3cf-4b5c-1r51=[2345, Complete, 5432]]
InComplete => [0003bb2d-f3cf-4b5c-9f71=[2311, InComplete, 5321], 0003bb2d-f3cf-4b5c-1d71=[4567, InComplete, 4321]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.