Java中有两个列表,如下所示.我需要从这两个列表中获取所有元素,如果这些列表中有相同的id个元素,这些元素的成本相同.

List<A> listA = new ArrayList<>();
List<A> listB = new ArrayList<>();
List<A> results = new ArrayList<>();

listA:

Id Date Cost
1 2022-01-01 11.65
2 2022-02-01 12.65
2 2022-03-01 13.65
3 2022-05-01 19.5

listB:

Id Date Cost
1 2022-04-01 1.65
1 2022-05-01 134.65
2 2022-02-01 12.65
2 2022-09-01 7.8
3 2022-06-01 3.65

结果应该是

结果列表应为-&gt;

Id Date Cost
1 2022-01-01 11.65
1 2022-04-01 1.65
1 2022-05-01 134.65
2 2022-02-01 25.3*
2 2022-03-01 13.65
2 2022-09-01 7.8
3 2022-05-01 19.5
3 2022-06-01 3.65

*(listA.cost+listB.cost这基于日期条件和id)

到目前为止,我一直在try 的是

Stream.concat(
        listA.stream().map(d -> new Result(d.getId(), d.getDate()), d.getCost()),
        listB.stream().map(b -> new Result(b.getId(), b.getDate(), b.getCost())
    )
    .collect(Collectors.toList());

我能够获得所有数据,但在这一步之后,我需要获得所有数据,如果有相同的date和相同的id,我们需要将listA中的cost相加,成本为listB

推荐答案

此方法将起作用:

我们的A级:

class A implements Comparable<A>{
  private int id;
  private String date;
  private double cost;

  public A(int i, String d, double c){
    id = i;
    date = d;
    cost = c;
  }

  public int getID(){
    return id;
  }

  public String getDate(){
    return date;
  }

  public double getCost(){
    return cost;
  }

  public void setCost(double c){
    cost = c;
  }

  @Override public int compareTo(A compareID) {
        int comp = (compareID).getID();
        return this.id - comp;
    }

  public String toString(){
    return id + " " + date + " " + cost;
  }
}

主要类别:

import java.util.*;
class Main {
  public static void main(String[] args) {
    List<A> listA = new ArrayList<>();
    List<A> listB = new ArrayList<>();
    List<A> results = new ArrayList<>();

    listA.add(new A(1, "2022-01-01", 11.65));
    listA.add(new A(2, "2022-02-01", 12.65));
    listA.add(new A(2, "2022-03-01", 13.65));
    listA.add(new A(3, "2022-05-01", 19.5));

    listB.add(new A(1, "2022-04-01", 1.65));
    listB.add(new A(1, "2022-05-01", 134.65));
    listB.add(new A(2, "2022-02-01", 12.65));
    listB.add(new A(2, "2022-09-01", 7.8));
    listB.add(new A(3, "2022-06-01", 3.65));

    results = listA;
    for(int i = 0; i < results.size(); i++){
      for(int j = 0; j < listB.size(); j++){
        if((results.get(i)).getDate().equals((listB.get(j)).getDate()) && (results.get(i)).getID() == (listB.get(j)).getID()){
          results.get(i).setCost(results.get(i).getCost() + listB.get(j).getCost());
          listB.remove(j);
          j -= 1;
        }
      }
    }
    results.addAll(listB);
    Collections.sort(results);
    System.out.println(results);
  }
}

输出:

[1 2022-01-01 11.65, 1 2022-04-01 1.65, 1 2022-05-01 134.65, 2 2022-02-01 25.3, 2 2022-03-01 13.65, 2 2022-09-01 7.8, 3 2022-05-01 19.5, 3 2022-06-01 3.65]

在我们的A类中,我们定义了私有实例变量,即iddatecost,并为该类设置了构造函数、访问器和变异器.我们还将设置自己的比较器,以便按ID排序.

在我们的主课上,我们把results设为listA.接下来,我们使用嵌套的for循环迭代resultslistB.如果results中的第i个元素和listB中的第j个元素具有相同的iddate,我们将在listA中添加值,并在listB中删除该元素.最后,如果listB中还有剩余的元素,我们将它们添加到results,然后对列表进行排序.

这不是最有效的方法,因为它涉及嵌套for循环和排序,但这仍然有效.

我希望这回答了你的问题!如果您有任何进一步的问题或澄清,请告诉我:)

Java相关问答推荐

从头开始使用Jgit初始化InMemoryRepository

Collections.binarySearch()使用Collections.reverseOrder()作为比较器返回-1

无法从TemporalAccessor获取Instant:{},ISO解析为2024-04- 25 T14:32:42类型为java.time. form.Parsed

Spring安全实现多个SQL表身份验证

Quarkus keycloat配置不工作.quarkus. keycloak. policy—enforcer. enable = true在. yaml表示中不工作

ApachePOI:不带换行的新行

@org.springframework.beans.factory.annotation.Autowired(required=true)-注入点有以下注释:-SpringBoot

Java inline Double条件和值解装箱崩溃

如何使用AWS CLI从S3存储桶中的所有对象中删除用户定义的元数据?

为什么不应用类型推断?

无法使用ApacheSpark依赖项构建JavaFX应用程序

基于接口的投影、原生查询和枚举

使用正则表达式从字符串中提取多个值

有谁能帮我修一下这个吗?使输出变得更加整洁

为什么在下面的Java泛型方法中没有类型限制?

Quarkus:运行时出现EnumConstantNotPresentException

如何在EL处理器中定义带有命名空间的变量?

在应用getCellFormula()时,Excel引用中的文件名始终为";[1]";使用Apache POI()

Java嵌套流查找任意值

未调用OnBackPressedCallback-Activitiy立即终止