如果list中的对像的编号和时间相同就把对像合并,并将数量相加

__小羊 2018-11-02 01:58:18
贴上代码:

public class Test1 {

public static void main(String[] args) {
List<Student> list = new ArrayList<Student>();

Student stu = new Student();
stu.setId("1");
stu.setName("張三");
stu.setPrice(12.5);
stu.setNumber(5.0);
stu.setDate("2018-11-01");
list.add(stu);

Student stu1 = new Student();
stu1.setId("2");
stu1.setName("李四");
stu1.setPrice(20.0);
stu1.setNumber(3.0);
stu1.setDate("2018-11-01");
list.add(stu1);


Student stu2 = new Student();
stu2.setId("1");
stu2.setName("張三");
stu2.setPrice(15.3);
stu2.setNumber(9.0);
stu2.setDate("2018-11-01");
list.add(stu2);

Student stu3 = new Student();
stu3.setId("3");
stu3.setName("王二");
stu3.setPrice(0.3);
stu3.setNumber(7.0);
stu3.setDate("2018-11-01");
list.add(stu3);

Student stu4 = new Student();
stu4.setId("1");
stu4.setName("張三");
stu4.setPrice(7.3);
stu4.setNumber(7.0);
stu4.setDate("2018-11-04");
list.add(stu4);





//相同ID 相同 date 的 number、price 做累加

//想要的效果如下:

//{"name":"張三","number":"14.0","id":"1","price":"27.8","date":"2018-11-01"},
//{"name":"王二","number":"7.0","id":"3","price":"0.3","date":"2018-11-01"},
//{"name":"李四","number":"3.0","id":"2","price":"20.0","date":"2018-11-01"},
//{"name":"張三","number":"7.0","id":"1","price":"7.3","date":"2018-11-04"}

/****************************************************************************/

Map<String, Student> map = new HashMap<String, Student>();
for (Student s : list) {
if (map.containsKey(s.getId())) {
Student st = map.get(s.getId());
st.setPrice(st.getPrice() + s.getPrice());
st.setNumber(st.getNumber() + s.getNumber());
map.put(s.getId(), st);
} else {
map.put(s.getId(), s);
}

}

for (Entry<String, Student> s : map.entrySet()) {
System.out.println(s.getKey() +"===========>>"+s.getValue());
}

//现在的效果 只区分了ID 时间没有区分
//1===========>>Student [id=1, name=張三, price=35.1, number=21.0, date=2018-11-01]
//2===========>>Student [id=2, name=李四, price=20.0, number=3.0, date=2018-11-01]
//3===========>>Student [id=3, name=王二, price=0.3, number=7.0, date=2018-11-01]

/****************************************************************************/

}

static class Student{
private String id;

private String name;

private Double price;

private Double number;

private String date;

public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Double getNumber() {
return number;
}
public void setNumber(Double number) {
this.number = number;
}

public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", price=" + price + ", number=" + number + ", date=" + date
+ "]";
}


}

}
...全文
420 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐先生 2019-02-12
  • 打赏
  • 举报
回复
Map<String, Student> map = new HashMap<String, Student>();
for (Student s : list) {
if (map.containsKey(s.getId()+e.getDate()) {
Student st = map.get(s.getId());
st.setPrice(st.getPrice() + s.getPrice());
st.setNumber(st.getNumber() + s.getNumber());
map.put(s.getId()+e.getDate(), st);
} else {
map.put(s.getId()+e.getDate(), s);
}

}
CHENFU_JAVA 2018-11-04
  • 打赏
  • 举报
回复
成功解决楼主问题,代码如下,你可以测试一下: 实体类: package csdn.test; import java.util.List; import java.util.Objects; public class Student { private String id; private String name; private Double price; private Double number; private String date; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } public Double getNumber() { return number; } public void setNumber(Double number) { this.number = number; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", price=" + price + ", number=" + number + ", date=" + date + "]"; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return Objects.equals(id, student.id) && Objects.equals(date, student.date); } @Override public int hashCode() { return Objects.hash(id, date); } public void merge(List<Student> list){ if (list.contains(this)){ int i = list.indexOf(this); Student student = list.get(i); this.number += student.number; this.price += student.price; list.remove(i); } list.add(this); } } 测试方法: package csdn.test; import java.util.*; public class Test1 { public static void main(String[] args) { List<Student> list = new ArrayList<Student>(); Student stu = new Student(); stu.setId("1"); stu.setName("張三"); stu.setPrice(12.5); stu.setNumber(5.0); stu.setDate("2018-11-01"); stu.merge(list); Student stu1 = new Student(); stu1.setId("2"); stu1.setName("李四"); stu1.setPrice(20.0); stu1.setNumber(3.0); stu1.setDate("2018-11-01"); stu1.merge(list); Student stu2 = new Student(); stu2.setId("1"); stu2.setName("張三"); stu2.setPrice(15.3); stu2.setNumber(9.0); stu2.setDate("2018-11-01"); stu2.merge(list); Student stu3 = new Student(); stu3.setId("3"); stu3.setName("王二"); stu3.setPrice(0.3); stu3.setNumber(7.0); stu3.setDate("2018-11-01"); stu3.merge(list); Student stu4 = new Student(); stu4.setId("1"); stu4.setName("張三"); stu4.setPrice(7.3); stu4.setNumber(7.0); stu4.setDate("2018-11-04"); stu4.merge(list); for (Student student:list) { System.out.println(student); } } }
黑夜行走者 2018-11-03
  • 打赏
  • 举报
回复
引用 3 楼 qq_39936465 的回复:
把中间一段修改了就行了



for (int i=0; i<list.size()-1;i++) {
Student st1=list.get(i);
for (int j=list.size()-1;j>i;j--) {
Student st2=list.get(j);
if(st1.getId()==st2.getId()&& st1.getDate()==st2.getDate()) {
st1.setPrice(st1.getPrice() + st2.getPrice());
st1.setNumber(st1.getNumber() + st2.getNumber());
list.remove(j);
}

}
}

for (int i=0;i<list.size();i++) {
System.out.println(i+1 + "===========>>" + list.get(i));
}



你要用equals
qq_39936465 2018-11-02
  • 打赏
  • 举报
回复
把中间一段修改了就行了


for (int i=0; i<list.size()-1;i++) {
			Student st1=list.get(i);
			for (int j=list.size()-1;j>i;j--) {
				Student st2=list.get(j);
				if(st1.getId()==st2.getId()&& st1.getDate()==st2.getDate()) {
					st1.setPrice(st1.getPrice() + st2.getPrice());
					st1.setNumber(st1.getNumber() + st2.getNumber());
					list.remove(j);
				}
				
			}
		}

		for (int i=0;i<list.size();i++) {
			System.out.println(i+1 + "===========>>" + list.get(i));
		}

琴岛橙子 2018-11-02
  • 打赏
  • 举报
回复
//相同ID 相同 date 的 number、price 做累加
根据你的思路 用map的方式 可以把 id-date 作为key

Map<String, Student> map = new HashMap<String, Student>();
for (Student s : list) {
String key = s.getId()+"-"+s.getDate();
if (map.containsKey(key)) {
Student st = map.get(s.getId());
st.setPrice(st.getPrice() + s.getPrice());
st.setNumber(st.getNumber() + s.getNumber());
map.put(key, st);
} else {
map.put(key, s);
}

}

qq_39936465 2018-11-02
  • 打赏
  • 举报
回复
Map 本身键值就是唯一性, 你把Id做键值,怎么也不会出现2个 Id=1的Map项。直接list用比对吧

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧