Java 在一个列表中查找匹配项并将其删除
我有一个列表,我需要在列表中循环查找匹配项,以便组合它们并将它们添加到另一个列表中。问题是,我总是在某些元素上多次迭代或跳过某些元素 列表中的每个对象都有两个int值。如果第一个int值是两个元素之间的匹配,我需要合并两个对象的第二个int值,并将该对象添加到另一个列表中 如果我有一张清单12,10,13,10,12,5,14,5,14,10,10,20 我想把12号和14号合并成一个新的列表 12,15,14,15和我原来的名单将剩下13,10,10,20 我尝试过使用for循环,有迭代器和没有迭代器,但都没有成功Java 在一个列表中查找匹配项并将其删除,java,Java,我有一个列表,我需要在列表中循环查找匹配项,以便组合它们并将它们添加到另一个列表中。问题是,我总是在某些元素上多次迭代或跳过某些元素 列表中的每个对象都有两个int值。如果第一个int值是两个元素之间的匹配,我需要合并两个对象的第二个int值,并将该对象添加到另一个列表中 如果我有一张清单12,10,13,10,12,5,14,5,14,10,10,20 我想把12号和14号合并成一个新的列表 12,15,14,15和我原来的名单将剩下13,10,10,20 我尝试过使用for循环,有迭代器和没
List<Record> finalList = new ArrayList<Record>();
for (int i = 0; i < tempAggregateList.size(); i++){
Record record = tempAggregateList.get(i);
for (int j = i+1; j < tempAggregateList.size(); j++){
Record nextRecord = tempAggregateList.get(j);
if (record.getFirstValue() == nextRecord.getFirstValue()){
record.setSecondValue(record.getSecondValue() + nextRecord.getSecondValue());
//then remove nextRecord from tempAggregateList
}
}
finalList.add(record);
}
按照我现在的方式,我的第一个for循环将循环我已经组合并添加到finalList的元素。删除我添加到finalList中的元素最简单,但我还没有找到方法。您应该能够使用streams:
// group by first value
Map<Integer, Record> newList = list.stream().collect(Collectors.groupingBy(Record::getFirstValue,
// for each record list for the same first value, add the second one
Collectors.collectingAndThen(
// add first and second value for each pair
Collectors.reducing((r1, r2) -> new Record(r1.getFirstValue(), r1.getSecondValue() + r2.getSecondValue())),
// there will be no empty list, so all optionals will be present
Optional::get));
如果你想要一个列表,在一行中完成
List<Record> result = list.stream().collect(
collectingAndThen(
toMap(Record::getFirstValue, r -> r, addRecords),
m -> new ArrayList<>(m.values())));
暗示从收集器进行静态导入。您应该能够使用流:
// group by first value
Map<Integer, Record> newList = list.stream().collect(Collectors.groupingBy(Record::getFirstValue,
// for each record list for the same first value, add the second one
Collectors.collectingAndThen(
// add first and second value for each pair
Collectors.reducing((r1, r2) -> new Record(r1.getFirstValue(), r1.getSecondValue() + r2.getSecondValue())),
// there will be no empty list, so all optionals will be present
Optional::get));
如果你想要一个列表,在一行中完成
List<Record> result = list.stream().collect(
collectingAndThen(
toMap(Record::getFirstValue, r -> r, addRecords),
m -> new ArrayList<>(m.values())));
从收集器的静态导入是隐含的。在finalList.addrecord之后,简单地添加tempagregateList.removei 在finalList.addrecord之后,简单地添加tempagregateList.removei 这使用groupingBy来获取列表的列表。如果列表的长度大于1,则会将其添加到最终列表中。如果列表的长度等于1,它将保留在原始列表中 这使用groupingBy来获取列表的列表。如果列表的长度大于1,则会将其添加到最终列表中。如果列表的长度等于1,它将保留在原始列表中
只是为了好玩,迭代,存储要删除的索引的集合,以及从初始列表中删除项目的反向迭代:
public static void main(String[] args) {
List<Record> tempAggregateList = new ArrayList<Record>();
tempAggregateList.add(new Record(12, 10));
tempAggregateList.add(new Record(13, 10));
tempAggregateList.add(new Record(12, 5));
tempAggregateList.add(new Record(14, 5));
tempAggregateList.add(new Record(14, 10));
tempAggregateList.add(new Record(10, 20));
List<Record> finalList = new ArrayList<>();
Set<Integer> set = new HashSet<>();
for (int i = 0; i < tempAggregateList.size(); i++) {
if (!set.contains(i)) {
Record record = tempAggregateList.get(i);
int baseValue = record.getFirstValue();
int sum = record.getSecondValue();
boolean found = false;
for (int j = i + 1; j < tempAggregateList.size(); j++) {
Record nextRecord = tempAggregateList.get(j);
if (nextRecord.getFirstValue() == baseValue) {
found = true;
set.add(i);
set.add(j);
sum += nextRecord.getSecondValue();
}
}
if (found)
finalList.add(new Record(baseValue, sum));
}
}
for (int i = tempAggregateList.size() - 1; i >= 0; i--) {
if (set.contains(i))
tempAggregateList.remove(i);
}
for (Record r : tempAggregateList) {
System.out.print("(" + r.getFirstValue() + ", " + r.getSecondValue() + ") ");
}
System.out.println();
for (Record r : finalList) {
System.out.print("(" + r.getFirstValue() + ", " + r.getSecondValue() + ") ");
}
}
只是为了好玩,迭代,存储要删除的索引的集合,以及从初始列表中删除项目的反向迭代:
public static void main(String[] args) {
List<Record> tempAggregateList = new ArrayList<Record>();
tempAggregateList.add(new Record(12, 10));
tempAggregateList.add(new Record(13, 10));
tempAggregateList.add(new Record(12, 5));
tempAggregateList.add(new Record(14, 5));
tempAggregateList.add(new Record(14, 10));
tempAggregateList.add(new Record(10, 20));
List<Record> finalList = new ArrayList<>();
Set<Integer> set = new HashSet<>();
for (int i = 0; i < tempAggregateList.size(); i++) {
if (!set.contains(i)) {
Record record = tempAggregateList.get(i);
int baseValue = record.getFirstValue();
int sum = record.getSecondValue();
boolean found = false;
for (int j = i + 1; j < tempAggregateList.size(); j++) {
Record nextRecord = tempAggregateList.get(j);
if (nextRecord.getFirstValue() == baseValue) {
found = true;
set.add(i);
set.add(j);
sum += nextRecord.getSecondValue();
}
}
if (found)
finalList.add(new Record(baseValue, sum));
}
}
for (int i = tempAggregateList.size() - 1; i >= 0; i--) {
if (set.contains(i))
tempAggregateList.remove(i);
}
for (Record r : tempAggregateList) {
System.out.print("(" + r.getFirstValue() + ", " + r.getSecondValue() + ") ");
}
System.out.println();
for (Record r : finalList) {
System.out.print("(" + r.getFirstValue() + ", " + r.getSecondValue() + ") ");
}
}
根本不清楚要如何过滤,如何得到12,15和14,15?@JoakimDanielson抱歉,如果第一个int值是两个元素之间的匹配,我需要合并两个对象的第二个int值,这一点不清楚。如果两个对象的第一个值都是12,那么我将它们的第二个值5和10合并成一个15,并将它们的第一个值保留为12。它更像是元素的一个键,不是对你问题的回答,但这听起来像是一个地图而不是列表的工作。出于某种原因,您需要使用列表吗?根本不清楚您要如何筛选,如何得到12,15和14,15?@JoakimDanielson抱歉,如果第一个int值是两个元素之间的匹配,我需要合并两个对象的第二个int值,这一点不清楚。如果两个对象的第一个值都是12,那么我将它们的第二个值5和10合并成一个15,并将它们的第一个值保留为12。它更像是元素的一个键,不是对你问题的回答,但这听起来像是一个地图而不是列表的工作。出于某种原因,您需要使用列表吗?我编辑了答案以使其进行编译,但不幸的是,该解决方案没有产生我想要的结果。名单仍然是最新的same@Drew13您是否使用了list=new ArrayListresult.valueSet?@Drew13我添加了一个更简单的构造。我编辑了答案以使其进行编译,但不幸的是,该解决方案没有产生我想要的结果。名单仍然是最新的same@Drew13您是否使用了list=new ArrayListresult.valueSet?@Drew13我添加了一个稍微简单一些的构造。@vilpe89它是如何破碎的?为什么?我执行了,它运行得非常好。也许它没有崩溃,但它确实不能正常工作。如果从索引i=2中删除,那么之后需要执行-i,因为我们需要迭代新的[2]。如果你不做-i,那么“for”将做++现在i=3,跳过一个现在i=2的项目…@vilpe89它是如何粉碎的?为什么?我执行了,它运行得非常好。也许它没有崩溃,但它确实不能正常工作。如果从索引i=2中删除,那么之后需要执行-i,因为我们需要迭代新的[2]。如果你不做-i,那么“for”将做++现在i=3,并跳过现在i=2的一项。。。
(13, 10) (10, 20)
(12, 15) (14, 15)