业务背景:一个list集合了若干个student对象,并且student对象具有name和money属性,此时我们需要合并具有相同name属性的student的money.
Student类的代码:
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:
<span style="white-space:pre"> </span>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<Student> list = new ArrayList<Student>();
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
第一种合并方式:
<span style="white-space:pre"> </span>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);
}
}
}
<span style="white-space:pre"> </span>for (Student student : list) {
System.out.println(student.toString());
}
结果如下:
Student [name=jack, money=20]
Student [name=peter, money=30]
第二种合并方式:
<span style="white-space:pre"> </span>Map<String, Student> map = new HashMap<String, Student>();
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());
}
结果与上面一致.
总结:个人认为第二种方式更加清晰,更加容易理解,建议采用第二种方式.