ArrayList重复元素合并

时间:2015-01-01 22:20:56

标签: java arraylist collections

我有一个Arraylists的Arraylist。首先,我试图比较所有的arraylists,如果第一个元素是相等的,将所有重复的arraylists合并为一个,并将每个元素的最后元素相加。每个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);

我希望最终结果成为    archiveList = [“2605”,“SD”,“65”]; //最后一个元素是来自prev数组的总和(25 + 25 + 20)    archiveList = [“3470”,“SD2”,“20”]

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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