List某字段相同时将其他字段数据相加

eg:List<User>中,User有id和money两个字段,如果id相同,就把User合并,即将money相加。

(代码中前段内容是两个list的追加,list1后面追加list2,最后存放在list1中)

数据:1:10;2:20;1:40

输出:1:50;2:20

User.java

package list;

public class User {
    private String id;
    private int money;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public int getMoney() {
        return money;
    }
    public void setMoney(int money) {
        this.money = money;
    }

}

 

test.java

package list;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import list.User;
//list 某字段相同时合并其他字段数据
//List<User>中,User有id和money两个字段,如果id相同,就把User合并,并且将money相加。
public class test {
    public static void main(String[] args) {
        demo();
    }
    public static void demo(){
    List<User> list1 = new ArrayList<User>();
    List<User> list2 = new ArrayList<User>();
    User user1=new User();
    user1.setId("1");
    user1.setMoney(10);
    list1.add(user1);
    
    User user2=new User();
    user2.setId("2");
    user2.setMoney(20);
    User user3=new User();
    user3.setId("1");
    user3.setMoney(40);
    list2.add(user2);
    list2.add(user3);
    
    list1.addAll(list2);
    System.out.println("合并前:");
    for (User u : list1) {
         System.out.println(u.getId());
         System.out.println(u.getMoney());

     }
     
    User tmpUser = null;
     Map<String, User> map = new HashMap<String, User>();//合并后的User存在map中
     for(User oUser:list1) {
          tmpUser = map.get(oUser.getId());//获取某key对应value
          if (tmpUser != null) {
                  tmpUser.setMoney(tmpUser.getMoney() + oUser.getMoney());  //money合并
          } else {
               map.put(oUser.getId(), oUser);
         }
     }
     
     List<User> list = new ArrayList<User>();
     System.out.println("合并后:");
     for (String in : map.keySet()) {//遍历map
        //map.keySet()返回的是所有key的值
        User u = map.get(in);//得到每个key对应value的值
        list.add(u);
        System.out.println(u.getId()+":"+u.getMoney());
        }
     for (User u : list) {//新list输出
         System.out.println(u.getId());
         System.out.println(u.getMoney());

     }
     
    }//demo()函数结束

}

 

转载于:https://www.cnblogs.com/zhouerba/p/7356450.html

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设我们有两个List,分别是list1和list2,它们都有一个字段id,其他字段分别为value1和value2,我们需要将这两个List通过id字段合并成一个List,同将value1和value2相加,可以按照以下步骤实现: 1. 定义一个新的List,用于存放合并后的结果: ```java List<CombinedObject> combinedList = new ArrayList<>(); ``` 2. 遍历list1,将其中的元素转换为CombinedObject对象,并加入到combinedList中: ```java list1.stream() .map(obj1 -> new CombinedObject(obj1.getId(), obj1.getValue1(), 0)) .forEach(combinedList::add); ``` 这里使用了map方法将list1中的元素转换为CombinedObject对象,其中value2字段设为0,表示还没有对应的元素。 3. 遍历list2,将其中的元素与combinedList中的元素合并,如果id相同,则将value2相加: ```java list2.stream() .forEach(obj2 -> { CombinedObject combinedObj = combinedList.stream() .filter(combined -> combined.getId().equals(obj2.getId())) .findFirst() .orElse(null); if (combinedObj != null) { combinedObj.setValue2(combinedObj.getValue2() + obj2.getValue2()); } else { combinedList.add(new CombinedObject(obj2.getId(), 0, obj2.getValue2())); } }); ``` 这里使用了forEach方法遍历list2中的元素,然后使用filter方法找到combinedList中对应的元素,如果找到了,则将value2相加,否则新建一个CombinedObject对象并加入到combinedList中。 4. 最后可以按照id字段对combinedList进行排序: ```java combinedList.sort(Comparator.comparing(CombinedObject::getId)); ``` 这里使用了sort方法和Comparator接口对combinedList中的元素按照id字段进行排序。 完整的代码示例: ```java import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class MergeLists { public static void main(String[] args) { List<Object1> list1 = new ArrayList<>(); list1.add(new Object1("id1", 1)); list1.add(new Object1("id2", 2)); list1.add(new Object1("id3", 3)); List<Object2> list2 = new ArrayList<>(); list2.add(new Object2("id1", 10)); list2.add(new Object2("id2", 20)); list2.add(new Object2("id4", 40)); List<CombinedObject> combinedList = new ArrayList<>(); list1.stream() .map(obj1 -> new CombinedObject(obj1.getId(), obj1.getValue1(), 0)) .forEach(combinedList::add); list2.stream() .forEach(obj2 -> { CombinedObject combinedObj = combinedList.stream() .filter(combined -> combined.getId().equals(obj2.getId())) .findFirst() .orElse(null); if (combinedObj != null) { combinedObj.setValue2(combinedObj.getValue2() + obj2.getValue2()); } else { combinedList.add(new CombinedObject(obj2.getId(), 0, obj2.getValue2())); } }); combinedList.sort(Comparator.comparing(CombinedObject::getId)); System.out.println(combinedList); } } class Object1 { private String id; private int value1; public Object1(String id, int value1) { this.id = id; this.value1 = value1; } public String getId() { return id; } public int getValue1() { return value1; } } class Object2 { private String id; private int value2; public Object2(String id, int value2) { this.id = id; this.value2 = value2; } public String getId() { return id; } public int getValue2() { return value2; } } class CombinedObject { private String id; private int value1; private int value2; public CombinedObject(String id, int value1, int value2) { this.id = id; this.value1 = value1; this.value2 = value2; } public String getId() { return id; } public int getValue1() { return value1; } public int getValue2() { return value2; } public void setValue2(int value2) { this.value2 = value2; } @Override public String toString() { return "CombinedObject{" + "id='" + id + '\'' + ", value1=" + value1 + ", value2=" + value2 + '}'; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值