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());
}
}
}
我写的这个是绝对正确的。