ArrayLists重复元素合并
ArrayLists duplicate elements merging
我有一个 Arraylist 的 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);
我希望最终结果成为
archiveList = ["2605","SD","65"]; // 最后一个元素是前一个数组的总和(25+25+20)
archiveList = ["3470","SD2","20"]
提前谢谢大家,祝大家新年快乐!
您可以使用HashSet
,其中所有ArrayList
个元素都可以添加到这个HashSet
中。
最后你可以看到相同的元素将被合并。换句话说,whilo set中只有一个元素存在。
以下Java8个解决方案可能会解决您的问题:
// 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
我有一个 Arraylist 的 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);
我希望最终结果成为 archiveList = ["2605","SD","65"]; // 最后一个元素是前一个数组的总和(25+25+20) archiveList = ["3470","SD2","20"]
提前谢谢大家,祝大家新年快乐!
您可以使用HashSet
,其中所有ArrayList
个元素都可以添加到这个HashSet
中。
最后你可以看到相同的元素将被合并。换句话说,whilo set中只有一个元素存在。
以下Java8个解决方案可能会解决您的问题:
// 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