如果 Java8 中的第一個索引匹配,我希望合并串列中的串列。我有一份清單
[[ABC, 1.0, 4.0, 4.0], [ABC, 2.0, 4.0, 4.0], [ABC, 1.0, 72.0, 72.0], [XYZ, 1.0, 36.0, 36.0], [XYZ, 2.0, 16.0, 16.0]]
我希望以一種有效的方式得到如下結果,比如在 java 中使用流。結果應該是
[[ABC, 4.0, 116.0, 116.0], [XYZ, 3.0, 52.0, 52.0]]
有人可以幫忙嗎?
uj5u.com熱心網友回復:
- 對于串列串列中的每個串列
- 如果第一個值不在 hashmap 中,則使用第一個值作為鍵添加到 hashmap
- 如果 key 已經在 hashmap 中與串列中已經存在 hashmap 合并
- 基于哈希圖條目集創建新的串列串列
額外的功勞:使用 LinkedHashMap 保留外觀順序或 TreeMap 如果您希望按字母順序排列
uj5u.com熱心網友回復:
在這種情況下,Collectors.toMap應該使用選擇作為第一個索引的鍵,以及合并其余元素的合并函式。
例子:
List<List<Object>> input = Arrays.asList(
Arrays.asList("ABC", 1.0, 4.0, 4.0),
Arrays.asList("ABC", 2.0, 40.0, 40.0),
Arrays.asList("ABC", 1.0, 72.0, 72.0),
Arrays.asList("XYZ", 1.0, 36.0, 36.0),
Arrays.asList("XYZ", 2.0, 16.0, 16.0)
);
List<List<Object>> merged = new ArrayList<>(input.stream()
.collect(Collectors.toMap(
list -> list.get(0),
list -> list,
(l1, l2) -> Stream.concat(
Stream.of(l1.get(0)),
IntStream.range(1, l1.size())
.mapToObj(i -> (Double)l1.get(i) (Double)l2.get(i))
)
.collect(Collectors.toList()),
LinkedHashMap::new // keep insertion order
))
.values() // Collection<List<Object>>
);
System.out.println(merged);
// -> [[ABC, 4.0, 116.0, 116.0], [XYZ, 3.0, 52.0, 52.0]]
但是,輸入串列似乎是 String 和 double 資料的混合體,應該更好地將它們轉換為具有適當merge功能的類/記錄。
這是使用record自 Java 16 以來可用的merge方法和重寫toString方法的示例。
record Item(String name, double ... values) {
Item merge(Item that) {
return new Item(
this.name,
IntStream.range(0, this.values.length)
.mapToDouble(i -> this.values[i] that.values[i])
.toArray()
);
}
@Override
public String toString() {
return String.format("[%s, %s]", name,
Arrays.stream(values)
.mapToObj(String::valueOf)
.collect(Collectors.joining(", "))
);
}
};
List<Item> data = Arrays.asList(
new Item("ABC", 1.0, 4.0, 4.0),
new Item("ABC", 2.0, 40.0, 40.0),
new Item("ABC", 1.0, 72.0, 72.0),
new Item("XYZ", 1.0, 36.0, 36.0),
new Item("XYZ", 2.0, 16.0, 16.0)
);
List<Item> items = data.stream()
.collect(Collectors.collectingAndThen(
Collectors.toMap(
Item::name,
item -> item,
Item::merge,
LinkedHashMap::new // keep insertion order
),
map -> new ArrayList<>(map.values())
));
System.out.println(items);
// -> [[ABC, 4.0, 116.0, 116.0], [XYZ, 3.0, 52.0, 52.0]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/399175.html
上一篇:合并排序陣列?
