当前位置: 首页 > 知识库问答 >
问题:

如何将列表中具有相同值的两个字段的对象组合成一个精简列表?

汪弘盛
2023-03-14
class Item
{
    private String name;
    private String parentName;
    private Integer someValue;
    private Double anotherValue;

    public Item() {}

    //...elided getters/setters...
}
//PSEUDO CODE (Not JavaScript, but using JSON is easier to follow)
List<Item> items = [
    {
        "name": "Joe",
        "parentName": "Frank",
        "someValue": 10,
        "anotherValue": 15.0
    },
    {
        "name": "Joe",
        "parentName": "Frank",
        "someValue": 40,
        "anotherValue": 0.5
    },
    {
        "name": "Joe",
        "parentName": "Jack",
        "someValue": 10,
        "anotherValue": 10.0
    },
    {
        "name": "Jeff",
        "parentName": "Frank",
        "someValue": 10,
        "anotherValue": 10.0
    }
];
List<Item> items = [
    {
        "name": "Joe",
        "parentName": "Frank",
        "someValue": 50,
        "anotherValue": 15.5
    },
    {
        "name": "Joe",
        "parentName": "Jack",
        "someValue": 10,
        "anotherValue": 10.0
    },
    {
        "name": "Jeff",
        "parentName": "Frank",
        "someValue": 10,
        "anotherValue": 10.0
    }
];
    null

在Java8流中如何做到这一点?

我开始把它们放进桶里(见下文),但不确定从这里去哪里:

items
    .stream()
    .collect(
        Collectors.groupingBy(
            item -> new ArrayList<String>( Arrays.asList( item.getName(), item.getParentName() ) ) 
        )
    );

共有1个答案

祁俊喆
2023-03-14

collect(groupingBy())方法返回一个映射。

如果定义以下类:

class Tuple {
    String name;
    String parentName;
}

然后可以获得以下地图:

Map<Tuple, List<Item>> groupedItems = items.stream().collect(
            groupingBy(item -> new Tuple(item.getName(), item.getParentName())));
List<Item> finalItems = groupedItems.entrySet().stream().map(entry -> 
               new Item(entry.getKey().name, 
                        entry.getKey().parentName,
                        entry.getValue().stream().mapToInt(
                                  item -> item.someValue).sum(),
                        entry.getValue().stream().mapToDouble(
                                  item -> item.anotherValue).sum()))
               .collect(Collectors.toList());
 类似资料:
  • 我讨论这个问题已经有一段时间了,但没有结果。这几乎是一个重复的问题,至少有一个其他的问题在这里,但我不能完全弄清楚如何做,确切地说,我正在寻找从网上相关的答案。 我有一个熊猫数据帧(我们称之为),看起来像: 其中是索引。我想将其转换为类似以下内容: 因此,基本上,每个对应于相同索引的都应该组合到一个列表(或一个集合,或一个元组)中,该列表成为对应索引的。并且,如图所示,在相似的索引行之间是相同的,

  • 我还将列表一中的和成员的每个哈希代码与列表二中成员的哈希代码进行了比较。而且没有区别。但是如果我比较完整列表的hashcode,就有区别了。我不知道为什么。我很无助。 也许有人能帮我。请提前向我致以最诚挚的问候和感谢。

  • 我的问题是,它似乎影响和删除相同的元素从原来的列表!

  • 问题内容: 我有两个长度相同的清单: 和 我想在我有的地方创建字典 最好的方法是什么? 问题答案: dict(zip([1,2,3,4], [a,b,c,d])) 如果列表很大,则应使用。 如果键的数量多于值,并且您想为额外的键填写值,则可以使用。 这里,,,和是变量-它会正常工作(只要它们被定义),但你可能是指,如果你希望他们为字符串。 从每个可迭代对象中获取第一个项目,并生成一个元组,然后从每

  • 我有一个正在测试的方法,它返回一个对象列表。。。例如“Person”对象。 我有一个“预期的最后名字”列表来验证结果。 我目前有一个工作测试,它循环遍历“expectedLastNames”中的名称,并断言每个名称都包含在“Person”对象列表中。与此类似(请注意,以下代码段位于Kotlin中): 当断言通过时,这非常有效,并验证了我的方法。然而,当测试失败时,这是非常麻烦的,因为一旦遇到缺少的

  • 首先,我的问题类似于这个已经回答过的问题,在Java中,将两个arrayList合并成一个新的arrayList,没有重复项,并且顺序正确。 然而,这里的不同之处在于,我尝试将两个列表合并在一起,而不仅仅是一个字符串。我的意图是合并以下类型的两个对象(为了简化,我从示例中去掉了不必要的信息): 所以我得到了一个新的项目,它有一个总结计数。这将消除不需要的重复,因为这些对象上的uniqueKey是相