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

具有相同内容的列表内容之和

梁俊友
2023-03-14

我有一个来自类型“Details”的sortedList,它包含以下内容:

[0]=Details test0: 28.01.2020
[0]=Details test1: 1234
[0]=Details test2: abcd
[0]=Details test3: 1
[0]=Details test4: 20.6
[0]=Details test5: 20.20

[1]=Details test0: 28.01.2020
[1]=Details test1: 1234
[1]=Details test2: abcd
[1]=Details test3: 1
[1]=Details test4: 20.6
[1]=Details test5: 20.20

[2]=Details test0: 29.01.2020
[2]=Details test1: 1234
[2]=Details test2: abcd
[2]=Details test3: 1
[2]=Details test4: 20.7
[2]=Details test5: 20.20

现在,排序后的列表返回所有这些对象,但我想用相同的test0、test1、test2和test3、test4和test5(test3+test3、test4+test4和test5+test5):

[0]=Details test0: 28.01.2020
[0]=Details test1: 1234
[0]=Details test2: abcd
[0]=Details test3: 2
[0]=Details test4: 41.2
[0]=Details test2: 40.40

[1]=Details test0: 29.01.2020
[1]=Details test1: 1234
[1]=Details test2: abcd
[1]=Details test3: 1
[1]=Details test4: 2.7
[1]=Details test5: 20.20

我不确定list.stream().filter是否是解决此问题的最佳选项。有什么想法吗?应该找到所有test0重复项的两个方法:

    public static List<Detail> getDuplicates(final List<Detail> list) {
    return getDuplicatesMap(list).values()
        .stream()
        .filter(duplicates -> duplicates.size() > 1)
        .flatMap(Collection::stream)
        .collect(Collectors.toList());
}

private static Map<String, List<Details>> getDuplicatesMap(List<Details> list) {
    return list.stream().collect(Collectors.groupingBy(Details::test0));
}

共有1个答案

虞航
2023-03-14

您正在寻找的是基于几个属性合并重复的条目,而不仅仅是识别重复的条目。将Collectors.tomapMergeFunction一起使用应有助于解决此问题。

public static List<Details> getDuplicates(final List<Details> list) {
    return new ArrayList<>(list.stream()
            .collect(Collectors.toMap(dtl -> 
                            Arrays.asList(dtl.getTest0(), dtl.getTest1(), dtl.getTest2()), 
                    Function.identity(), Details::mergeDuplicates))
            .values());
}

其中,假设合并函数使用类型特定的numbers,可以按如下所示添加这些number:

static Details mergeDuplicates(Details a, Details b) {
    return new Details(a.getTest0(), a.getTest1(), a.getTest2(),
            a.getTest3() + b.getTest3(), a.getTest4() + b.getTest4(), a.getTest5() + b.getTest5());
}
 类似资料:
  • 问题内容: 前一段时间,我花了一些时间来寻找确定两个图像是否相同的方法,以回答[这个问题](http://codingdict.com/questions/100055。我现在面临一个稍微不同的问题:我手头大约有两千张图像,其中一些具有相同的内容,但是彼此缩放/旋转(旋转始终为90°的倍数),还有一个问题。不同的压缩方式和图像格式(主要是jpg,一些png和其他格式)。缩放比例不会超过2:1。我想

  • 如何生成多个页面的pdf报告,每个页面上的内容相同。以下是单页报告的代码。多个页面应位于单个pdf文件中。

  • 主要内容:jQuery Mobile 列表图标,实例,16x16 图标,实例,jQuery Mobile 列表缩略图,实例,实例,jQuery Mobile 列表图标,实例,分割按钮,实例,实例,气泡数字,实例,更多实例jQuery Mobile 列表图标 默认情况下每个列表项都会包含一个箭头图标 "carat-r" (右箭头)。如果要修改这个图标可以使用 data-icon 属性: 实例 <ul data-role="listview">   <li><a href="#">Default i

  • jQuery Mobile 列表图标 默认情况下每个列表项都会包含一个箭头图标 "carat-r" (右箭头)。如果要修改这个图标可以使用 data-icon 属性: <ul data-role="listview">   <li><a href="#">Default is right arrow</a></li>   <li data-icon="plus"><a href="#">da

  • 问题内容: 我的Java应用程序需要具有比较文件系统中两个不同文件并确定它们的二进制内容是否相同的能力。 这是我当前的代码: 任何有关如何正确进行比较功能的提示或建议,将不胜感激。 问题答案: 最简单的方法是将内容读取为两个字符串,例如 ,然后对这些执行。您是否需要更复杂的差分功能?

  • 所以我有一个递归程序,我试图生成一个字符串的所有排列。我打算将排列存储在一个名为ans的列表中。 每个当前排列都存储在用于填充ans列表的容器列表中。我怀疑,因为列表是一种引用类型,所以我可能会因为容器列表被操纵而丢失ans列表中的值?我是白痴吗