Java 在一个列表中查找匹配项并将其删除

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循环,有迭代器和没

我有一个列表,我需要在列表中循环查找匹配项,以便组合它们并将它们添加到另一个列表中。问题是,我总是在某些元素上多次迭代或跳过某些元素

列表中的每个对象都有两个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)