【问题标题】:ArrayLists duplicate elements mergingArrayLists重复元素合并
【发布时间】:2015-01-01 22:20:55
【问题描述】:

我有一个 Arraylist 的 Arraylist。首先,我尝试比较所有数组列表,如果第一个元素相等,则将所有重复的数组列表合并为一个,并对每个数组的最后一个元素求和。每个数组列表的大小固定为 3 个元素。

例如:

ArrayList<String> archiveList = new ArrayList<String>();
        archiveList.add("2605");
        archiveList.add("SD");
        archiveList.add("25");
ArrayList<String> archiveList2 = new ArrayList<String>();
        archiveList2.add("3470");
        archiveList2.add("SD2");
        archiveList2.add("25");   
ArrayList<String> archiveList3 = new ArrayList<String>();
        archiveList3.add("2605");
        archiveList3.add("SD2");
        archiveList3.add("20");
ArrayList<String> archiveList4 = new ArrayList<String>();
        archiveList4.add("2605");
        archiveList4.add("SD2");
        archiveList4.add("20");

//code to consolidate arraylists

ArrayList<ArrayList<String>> dataTable = new ArrayList<ArrayList<String>>();
           dataTable.addRow(archiveList);

我希望最终结果变成 归档列表 = ["2605","SD","65"]; // 最后一个元素是前一个数组的总和(25+25+20) archiveList = ["3470","SD2","20"]

提前谢谢大家,祝大家新年快乐!

【问题讨论】:

  • 你的规格太模糊了。当你说“有些是平等的”时,它似乎必须是第一个,而不是任何一个或任何两个。为什么你将最后一个值作为字符串而不是其他值或其他元素?
  • 我认为最好的办法是创建一个 POJO,因为您存储在每个 ArrayList 中的值之间似乎存在关系。然后只需合并一个相等的对象(您需要覆盖它)并创建一个新对象,该对象具有此“第三个”参数的总和。
  • dataTable.addAll(archiveList,archiveList2,archive3,archiveList4) 甚至不是有效代码。 addAll 没有可变参数版本。
  • 对不起,误导的代码,我重新编辑了它。这只是一个常规的 addRow 方法。
  • @Marquis - 你找到合适的解决方案了吗?

标签: java arraylist collections


【解决方案1】:

以下 Java 8 解决方案可能会解决您的问题:

// First, group the lists by the "id" i.e. the first entry in each list
final Map<String, List<List<String>>> groupedLists =
        Stream.of(archiveList1, archiveList2, archiveList3, archiveList4)
                .collect(Collectors.groupingBy(l -> l.get(0)));

// Now, setup the result
final List<List<String>> result = groupedLists.values()
        .stream()
        .map(ll -> {
            String first = ll.get(0).get(0);        // The key e.g. "2605"
            String second = ll.get(0).get(1);       // The second element e.g. "SD"

            // Summarize the lists with the same "id"
            int sum = ll.stream()
                    .map(archive -> archive.get(2)) // This is the "number"
                    .mapToInt(Integer::parseInt)    // convert it to an int
                    .sum();                         // And summarize

            // This list holds the aggregated result
            List<String> aggregate = new ArrayList<>();
            aggregate.add(first);
            aggregate.add(second);
            aggregate.add(Integer.valueOf(sum).toString());
            return aggregate;
        })
        .collect(Collectors.toList());              // Finally, collect the whole thing to a list of lists

【讨论】:

  • 我真的很喜欢你的想法 wassgreen。不幸的是,由于我们还没有使用 Java 8,所以我无法在生产中实现它。不过我会自己尝试一下。谢谢。
【解决方案2】:

您可以使用HashSet,其中所有ArrayList元素都可以添加到这个HashSet中。 最后你可以看到相同的元素将被合并。换句话说,whilo set 中只存在一个元素。

【讨论】:

  • A HashSet 合并了什么?你能举个例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 2021-06-13
  • 2020-03-07
  • 1970-01-01
  • 2023-04-02
  • 2013-12-06
  • 1970-01-01
相关资源
最近更新 更多