Java 如何合并 List?

2019 年 8 月 19 日
 zealinux

比如:

A:[{"id": "A1", "count": 1}, {"id": "A3", "count": 2},...] B: [{"id": "A2", "count": 10}, {"id": "A3", "count": 10},...]

合并 AB 成

[{"id": "A1", "count": 1}, {"id": "A2", "count": 10}, {"id": "A3", "count": 12},...]

即,如果有在 A,B 中,则 countA+countB


有没有简单的方法, 我用了 N 个 for 循环,代码冗长。

5854 次点击
所在节点    Java
18 条回复
daozhihun
2019 年 8 月 19 日
全部放到一个 hashSet 里面进行计数 ^o^
daozhihun
2019 年 8 月 19 日
说错了,放在 Hashtable 里面计数。。
lhx2008
2019 年 8 月 19 日
这种就是用 Map 就可以了,Map<String, Object>,String = A1/A2/A3 Object = {"id": "A3", "count": 2} 如果要保持有序用 LinkedListMap
Magentaize
2019 年 8 月 19 日
groupby
chendy
2019 年 8 月 19 日
```java
List<Something> result = Stream.of(listA, listB)
.flatMap(Collection::stream)
.collect(Collectors.groupingBy(t -> t.getId(), Collectors.summingInt(x -> x.getCount())))
.entrySet().stream().map(entry -> new Something(entry.getKey(), entry.getValue()))
.collect(Collectors.toList());
```
zhazi
2019 年 8 月 19 日
reduce
lastpass
2019 年 8 月 19 日
当然是直接使用 map 进行合并。继承如 hashmap 类,并且重写其 put 方法。在 put 的之前先检验,累加。
→_→然后再 new ArrayList(map.values())转换回 list。
zealinux
2019 年 8 月 19 日
@chendy

这语法虽然看起来有些怪异。
但本能觉得应该是优异的。👍

有点不想再写 getId(),getCount(),hashMap 都是简单得 put 进去的。
A 和 B 不一定是相同结构的,K/V 数量可能不一致。
lastpass
2019 年 8 月 19 日
当然,如果你要稍微优雅一点,可以将 hashmap 的继承类写成匿名 /私有 内部类。
或者按照 JAVA 最正统也最优雅但也最费事儿的写法。是自己去实现一个 list 接口。自己现实 addAll 方法。实现取并集。→_→
xyooyx
2019 年 8 月 20 日
zealinux
2019 年 8 月 20 日
@lqw3030 不行,addAll 只会无脑拼接。
gonethen
2019 年 8 月 20 日
private static void removeDuplicate(List<String> list) {
LinkedHashSet<String> set = new LinkedHashSet<>(list.size());
set.addAll(list);
list.clear();
list.addAll(set);
}
cigarzh
2019 年 8 月 20 日
groupby 之后再 sum
Raymon111111
2019 年 8 月 20 日
就是放进 map 然后转回来
zifangsky
2019 年 8 月 20 日
给你写了一份测试代码,我试了下没毛病。
zhady009
2019 年 8 月 20 日
Rwing
2019 年 8 月 20 日
var list1 = new List<Item> { new Item { Id = "A1", Count = 2 }, new Item { Id = "A2", Count = 2 } };
var list2 = new List<Item> { new Item { Id = "A3", Count = 2 }, new Item { Id = "A2", Count = 10 } };
var list3 = list1.Concat(list2)
.GroupBy(i => i.Id)
.Select(g => new Item() { Id = g.Key, Count = g.Sum(i => i.Count) })
.ToList();


C# 欢迎你...
yyConstantine
2019 年 8 月 20 日
@lhx2008 那 Object 里的 count 怎么取出呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/593324

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX