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);//两个list合并,此时数据还没有相加,只是在后面追加另一个list
    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());
          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()函数结束

}
时间: 2025-01-05 06:37:40

List某字段相同时将其他字段数据相加的相关文章

数据窗口字段编辑时过滤下拉数据窗口

前提:将数据窗口的下tab键用回车键取代. // event editchanged datawindowchild ldw_temp String ls_filter Long ll_start If dwo.Name = 'syjsf02' Then This.GetChild('syjsf02',ldw_temp) If Trim(Data)='' Or IsNull(Data) Then ls_filter = "" Else ls_filter = "(szzxm0

Struts(二十四):短路验证&amp;重写实现转换验证失败时短路&amp;非字段验证

短路验证: 若对一个字段使用多个验证器,默认情况下会执行所有的验证.若希望前面的验证器没有通过,后面的验证器就不再执行,可以使用短路验证. 1.如下拦截器,如果输入字符串,提交表单后,默认是会出现三个错误:字段转换失败.conversion验证失败.取值范围失败. <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds

MYSQL 表中汉字写入或字段赋值时乱码情况排误

-- 当修改字段值,或是直接写入时,汉字变成乱码情况 ,[可注意一下数据库名,记得修改] -- 当字符顺序对汉字不兼容时,可能直接导致乱码情况发生. 最好做到库.表.字段(字符类型)排序规则是否一致 -- eg.在某库下建了临时表没有指定字符排序规则,下游会使用时,将临时表中的str字段值赋值给另外一个库表,可能会出现乱码 -- 未指定排序建表时,则表的排序规则是其库的排序规则 -- 1. 库级别 SELECT * -- DEFAULT_CHARACTER_SET_NAME DEFAULT_CO

现代 C++ 编译时 结构体字段反射

基于 C++ 14 原生语法,不到 100 行代码:让编译器帮你写 JSON 序列化/反序列化代码,告别体力劳动.?? 本文不讨论完整的 C++ 反射技术,只讨论结构体 (struct) 的字段 (field) 反射,及其在序列化/反序列化代码生成上的应用. 正文开始于 [sec|静态反射] 部分,其他部分都是铺垫..可以略读... 背景(TL;DR) 很多人喜欢把程序员称为 码农,程序员也经常嘲讽自己每天都在 搬砖.这时候,大家会想:能否构造出一些 更好的工具,代替我们做那些无意义的 体力劳动

[Elasticsearch] 多字段搜索 (六) - 自定义_all字段,跨域查询及精确值字段

自定义_all字段 在元数据:_all字段中,我们解释了特殊的_all字段会将其它所有字段中的值作为一个大字符串进行索引.尽管将所有字段的值作为一个字段进行索引并不是非常灵活.如果有一个自定义的_all字段用来索引人名,另外一个自定义的_all字段用来索引地址就更好了. ES通过字段映射中的copy_to参数向我们提供了这一功能: PUT /my_index { "mappings": { "person": { "properties": {

SqlBulkCopy excel 字段映射解决办法二 使用数字索引代替 字段名称 做映射 避免字段中有中文 大小写等情况

多线程的SqlBulkCopy批量导入.事务和SqlBulkCopy使用的数据集中自定义映射字段的注意事项 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68

SELECT 字段 FROM 表 WHERE 某字段 Like 条件

SELECT 字段 FROM 表 WHERE 某字段 Like 条件   其中关于条件,SQL提供了四种匹配模式: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文, 请使用两个百分号(%%)表示.  比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' ,将会把u_name为"张三","张猫三"."三脚猫","唐三藏"等等有"三"的记

[Oracle]根据字段值全库搜索相关数据表和字段

这个需求比较冷门,但对于在某些特定的情况下,还是会有这样的需要的.好在Oracle实现还比较方便,用存储过程则轻松实现. 查询字符串: create or replace procedure search_string(pString in varchar) as cursor all_tab_cursor is select a.owner, a.table_name, b.column_name from dba_tables a, dba_tab_columns b, dba_object

Mysql中用SQL增加、删除字段,修改字段名、字段类型、注释,调整字段顺序总结

在网站重构中,通常会进行数据结构的修改,所以添加,删除,增加mysql表的字段是难免的,有时为了方便,还会增加修改表或字段的注释,把同字段属性调整到一块儿.这些操作可以在phpmyadmin或者别的mysql管理工具中完成,但是我们有时为了更方便的管理,会选择写sql语句来实现. 1.增加一个字段  代码如下 复制代码 //增加一个字段,默认为空alter table user add COLUMN new1 VARCHAR(20) DEFAULT NULL; //增加一个字段,默认不能为空al