List相同字段合并问题

图片说明
List里有多对象,每对象有货名String和货量Double的字段,如货名相同货量就相加,结果在新CargoList里只有一个对象了四条数据IPE:1400,BNZ:1100,VAM:1000,CSS:1000

class Student{

private String store;

private int money;

private Date date;

private Integer status=0;

    public String getStore() {  
        return store;  
    }  
    public void setStore(String store) {  
        this.store = store;  
    }  
    public int getMoney() {  
        return money;  
    }  
    public void setMoney(int money) {  
        this.money = money;  
    }  
    public Date getDate() {  
        return date;  
    }  
    public void setDate(Date date) {  
        this.date = date;  
    }  
    public Student() {  
        super();  
    }  
    /*public Student(String store, int money, Date date,Integer status) { 
        super(); 
        this.store = store; 
        this.money = money; 
        this.date = date; 
        this.status=status; 
    }*/  

    @Override  
    public String toString() {  
        return "\nStudent [store=" + store + ", money=" + money + ", date="  
                + DateUtil.formatDate(date, "yyyy-MM-dd") + ", status=" + status + "]\n";  
    }  

    public Student(String store, int money, Date date) {  
        super();  
        this.store = store;  
        this.money = money;  
        this.date = date;  
    }  
    public Integer getStatus() {  
        return status;  
    }  
    public void setStatus(Integer status) {  
        this.status = status;  
    }  
}  

  @Test  

ublic void testList() throws Exception{

String format="yyyy-MM-dd";

Student student1=new Student("bb",12,DateUtil.formatString("2017-06-01", format));

Student student2=new Student("aa",13 ,DateUtil.formatString("2017-06-01", format));

Student student3=new Student("bb",12,DateUtil.formatString("2017-06-01", format));

Student student4=new Student("dd",14,DateUtil.formatString("2017-06-02", format));

Student student5=new Student("cc",15,DateUtil.formatString("2017-06-03", format));

Student student6=new Student("bb",16,DateUtil.formatString("2017-06-03", format));

Student student7=new Student("bb",17,DateUtil.formatString("2017-06-03", format));

Student student8=new Student("dd",18,DateUtil.formatString("2017-06-04", format));

Student student9=new Student("cc",19,DateUtil.formatString("2017-06-04", format));

Student student10=new Student("dd",20,DateUtil.formatString("2017-06-04", format));

Student student11=new Student("aa",22,DateUtil.formatString("2017-06-01", format));

List list=Lists.newArrayList();

list.add(student1);

list.add(student2);

list.add(student3);

list.add(student4);

list.add(student5);

list.add(student6);

list.add(student7);

list.add(student8);

list.add(student9);

list.add(student10);

list.add(student11);

System.out.println("合并前list: "+list);

for(int i=0;i<list.size();i++){

Student student=list.get(i);

if (!student.getStatus().equals(1)) {

String store=student.getStore();

Date date=student.getDate();

    for (int j = i+1; j < list.size(); j++) {  
        if (!list.get(j).getStatus().equals(1)) {  
            Student mergeStudent=list.get(j);  
            if (mergeStudent.getStore().equals(store) && DateUtils.isSameDay(date, mergeStudent.getDate())) {  
                student.setMoney(student.getMoney()+mergeStudent.getMoney());  

                mergeStudent.setStatus(1);  
            }  
        }  
    }  
}  

}

System.out.println();

System.out.println("合并后list: "+list);

效果如下:
合并前list: [

Student [store=bb, money=12, date=2017-06-01, status=0]

,

Student [store=aa, money=13, date=2017-06-01, status=0]

,

Student [store=bb, money=12, date=2017-06-01, status=0]

,

Student [store=dd, money=14, date=2017-06-02, status=0]

,

Student [store=cc, money=15, date=2017-06-03, status=0]

,

Student [store=bb, money=16, date=2017-06-03, status=0]

,

Student [store=bb, money=17, date=2017-06-03, status=0]

,

Student [store=dd, money=18, date=2017-06-04, status=0]

,

Student [store=cc, money=19, date=2017-06-04, status=0]

,

Student [store=dd, money=20, date=2017-06-04, status=0]

,

Student [store=aa, money=22, date=2017-06-01, status=0]

]

合并后list: [

Student [store=bb, money=24, date=2017-06-01, status=0]

,

Student [store=aa, money=35, date=2017-06-01, status=0]

,

Student [store=bb, money=12, date=2017-06-01, status=1]

,

Student [store=dd, money=14, date=2017-06-02, status=0]

,

Student [store=cc, money=15, date=2017-06-03, status=0]

,

Student [store=bb, money=33, date=2017-06-03, status=0]

,

Student [store=bb, money=17, date=2017-06-03, status=1]

,

Student [store=dd, money=38, date=2017-06-04, status=0]

,

Student [store=cc, money=19, date=2017-06-04, status=0]

,

Student [store=dd, money=20, date=2017-06-04, status=1]

,

Student [store=aa, money=22, date=2017-06-01, status=1]

]

业务背景:

如果属性(比如货物)相同,就把属性的值相加合并(这里以学生为例,如果是同一个学生,就把他们的钱数相加)

代码如下:

public class Student {

private String name;

private int money;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getMoney() {

return money;

}

public void setMoney(int money) {

this.money = money;

}

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + money;

result = prime * result + ((name == null) ? 0 : name.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

Student other = (Student) obj;

//将money属性注释,则对象的equals()方法会忽略money属性的比较

// if (money != other.money)

// return false;

if (name == null) {

if (other.name != null)

return false;

} else if (!name.equals(other.name))

return false;

return true;

}

@Override

public String toString() {

return "Student [name=" + name + ", money=" + money + "]";

}

}

创建我们的list:

Student s1 = new Student();

s1.setName("peter");

s1.setMoney(10);

Student s2 = new Student();

s2.setName("peter");

s2.setMoney(20);

Student s3 = new Student();

s3.setName("jack");

s3.setMoney(5);

Student s4 = new Student();

s4.setName("jack");

s4.setMoney(15);

List list = new ArrayList();

list.add(s1);

list.add(s2);

list.add(s3);

list.add(s4);

第一种合并方式:

for ( int i = 0 ; i < list.size() - 1 ; i ++ ) {

for (int j = list.size() - 1 ; j > i; j --) {

Student stu = list.get(i);

Student otherStu = list.get(j);

if(stu.equals(otherStu)) {

int money = stu.getMoney();

int otherMoney = otherStu.getMoney();

int totalMoney = money + otherMoney;

stu.setMoney(totalMoney);

list.remove(j);

}

}

}

for (Student student : list) {

System.out.println(student.toString());

}

结果如下:

Student [name=jack, money=20]

Student [name=peter, money=30]

第二种合并方式:

Map map = new HashMap();

for (Student student : list) {

String key = student.getName();

if(map.containsKey(key)) {

Student stu = map.get(key);

int preMoney = stu.getMoney();

int total = preMoney + student.getMoney();

student.setMoney(total);

}

map.put(key, student);

}

    list.clear();  
    list.addAll(map.values());  

    for (Student student : list) {  
        System.out.println(student.toString());  
    } 

结果如下:

Student [name=jack, money=20]

Student [name=peter, money=30]

假设list列表为:
CargoList
Obj.Name:货名
Obj.Num:数量

//用map来存放货名(name)和数量(num)
List> list = new ArrayList>();
for(int i=0;i Map map = new HashMap();
for(int j=0;i<list.size;j++){
//查找某个货名是否已经保存
if(list.get(j).get("name").toString().equals(CargoList.get(i).getName)){
map = list.get(j);
break;
}
}
if(map.get("name") != null){//某个货名已经保存的时候数量加上新的
map.put("name", CargoList.get(i).getName);
map.put("num", map.get("num")+CargoList.get(i).getNum);
} else {//某个货名未保存的时候把这个数量放进去保存
map.put("name", CargoList.get(i).getName);
map.put("num", CargoList.get(i).getNum);
list.add(map);
}
}
list就是所有货名对应的数量

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class TestKList {

public static void main(String[] args) {

// TestKList testKList = new TestKList();
// testKList.M1();
TestKList testKList1 = new TestKList();
testKList1.M2();

}


public void M1() {
    TestKList kList = new TestKList();
    List<Map<String, Double>> list = kList.intit();
    Map<String, Double> mapALL = new HashMap<>();
    for (Map<String, Double> map : list) {
        Set<String> keySet = map.keySet();
        for (String key : keySet) {
            if (mapALL.containsKey(key)) {
                Double double1 = mapALL.get(key) + map.get(key);
                mapALL.put(key, double1);
                map.put(key, mapALL.get(key));
            } else {
                mapALL.put(key, map.get(key));
            }
        }
    }
    System.out.println(mapALL);
    for (Map<String, Double> map : list) {
        System.out.println(map);
    }
}

public void M2() {
    TestKList kList = new TestKList();
    List<Map<String, Double>> list = kList.intit();
    Map<String, Double> mapALL = new HashMap<>();
    for (Map<String, Double> map : list) {
        Set<String> keySet = map.keySet();
        for (String key : keySet) {
            if (mapALL.containsKey(key)) {
                Double double1 = mapALL.get(key) + map.get(key);
                mapALL.put(key, double1);
            } else {
                mapALL.put(key, map.get(key));
            }
        }
    }
    for (Map<String, Double> map : list) {
        Set<String> keySet = map.keySet();
        for (String key : keySet) {
            if (mapALL.containsKey(key)) {
                map.put(key, mapALL.get(key));
            }
        }
    }
    for (Map<String, Double> map : list) {
        System.out.println(map);
    }
}


public List<Map<String, Double>> intit() {
    List<Map<String, Double>> list = new ArrayList<>();
    Map<String, Double> map = new HashMap<>();
    map.put("IPE", 600.00);
    map.put("BNZ", 700.00);
    map.put("VAM", 500.00);
    list.add(map);
    Map<String, Double> map1 = new HashMap<>();
    map1.put("IPE", 600.00);
    map1.put("BNZ", 400.00);
    map1.put("CSS", 700.00);
    list.add(map1);
    Map<String, Double> map2 = new HashMap<>();
    map2.put("IPE", 200.00);
    map2.put("CSS", 300.00);
    map2.put("VAM", 500.00);
    list.add(map2);
    return list;
}

}

输出结果:
************M1********
{VAM=500.0, IPE=600.0, BNZ=700.0}
{CSS=700.0, IPE=1200.0, BNZ=1100.0}
{CSS=1000.0, VAM=1000.0, IPE=1400.0}
************M2********
{VAM=1000.0, IPE=1400.0, BNZ=1100.0}
{CSS=1000.0, IPE=1400.0, BNZ=1100.0}
{CSS=1000.0, VAM=1000.0, IPE=1400.0}

class Object():
def init(self,ipe=none,bnz=none,vam=none):
self.ipe=ipe
self.bnz=bnz
self.vam=vam

class Cargolist():
def init(self):
self.list=[]
self.ipe=none
self.bnz=none
self.vam=none

def add_object(self,*parameter):
    oject=Object(parameter[0],parameter[1],parameter[2])
    self.list.append(object)
    for i in self.list:
        self.ipe+=i.ipe
        self.bnz+=i.bnz
        self.vam+=i.vam

你需要初始化Cargolist这类,然后调用add_object函数来添加object对象。*parameter实际上是一个列表,你只管输入参数就行。当你添加完了
之后,直接print(self.ipe)就知道这个属性的值了

ps:这是python语言写的哈

package com.td.admin.serviceImpl;

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

public class Test {
public static class Object1{
String goodsName;
Double counts;
public String getGoodsName() {
return goodsName;
}
public void setGoodsName(String goodsName) {
this.goodsName = goodsName;
}
public Double getCounts() {
return counts;
}
public void setCounts(Double counts) {
this.counts = counts;
}

}
public static void main(String[] args) {
    List<Object> objectList =  new ArrayList<Object>();//数据源
    Map<String,Double> map = new HashMap<String,Double>();
    map.put("IPE", 600D);
    map.put("BNZ", 700D);
    map.put("VAM", 500D);
    Map<String,Double> map2 = new HashMap<String,Double>();
    map2.put("IPE", 600D);
    map2.put("BNZ", 400D);
    map2.put("CSS", 700D);
    Map<String,Double> map3 = new HashMap<String,Double>();
    map3.put("IPE", 200D);
    map3.put("CSS", 300D);
    map3.put("VAM", 500D);
    objectList.add(map);
    objectList.add(map2);
    objectList.add(map3);

    List<Object1> objList1 = new ArrayList<Object1>(); //全部纳入一个list然后在把重复的进行相加
    for (int i = 0; i < objectList.size(); i++) {
        Object obj = objectList.get(i);
        if(obj instanceof Map) {
            Map<String,Double> mp = (Map<String,Double>)obj;
            for (String key : mp.keySet()) {
                Object1 object1 = new Object1();
                object1.setGoodsName(key);
                object1.setCounts(mp.get(key));
                objList1.add(object1);
            }
        }
    }

    List<Object1> obj2 = new ArrayList<Object1>();//生成新的list
   for (int i = 0; i < objList1.size(); i++) {
       Object1 obj3 = objList1.get(i);
       Double double1 = obj3.getCounts();
       for (int j = i+1; j < objList1.size(); j++) {
           if(obj3.getGoodsName().equals(objList1.get(j).getGoodsName())) {
               double1+=objList1.get(j).getCounts();
               objList1.remove(j);

           }
       }
       obj3.setCounts(double1);
       obj2.add(obj3);
   }
   for (int i = 0; i < obj2.size(); i++) {
       System.out.print(obj2.get(i).getGoodsName()+"---"+obj2.get(i).getCounts());
   }

}

}

我写的这个是绝对正确的。