List集合中的对象根据某个相同的属性,合并另外属性
Posted xm970829
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了List集合中的对象根据某个相同的属性,合并另外属性相关的知识,希望对你有一定的参考价值。
背景描述: 本来要做一个学院的到馆排行榜,取前3个学院信息,是根据学院名来做的,但是学院到馆的数据并不是仅仅从一个数据库里取得的,分为南校区和北校区。那么我这里就获得了两个学院排行的List。那么就得把相同的学院进行合并,到馆次数相加。把两个List合并成一个List,再根据到馆次数进行排行,取前3个学院信息。
实现:
1:首先将college实体实现一个Comparable接口,如下:
2:因为最终是根据countNum的值来获前3的数据的,在college实体里,添加如下方法(其实实现了上面的那个接口,这个方法是必须重写的)
3:去除重复的collegeName的list,并把countnum相加,返回前面三个
/**
* 去除重复key(对象中的某个值),并且合并value(想要合并的某个对象的int属性值)
* @param oldList
* @return
*/
public static List<College> getNewList(List<College> oldList){
HashMap<String,College> tempMap = new HashMap<String,College>();
//去掉重复的key
for(College College : oldList){
String temp = College.getCollegeName();
//containsKey(Object key)该方法判断Map集合中是否包含指定的键名,如果包含返回 true,不包含返回false
//containsValue(Object value)该方法判断Map集合中是否包含指定的键值,如果包含返回true,不包含返回false
if(tempMap.containsKey(temp)){
College newCollege = new College();
newCollege.setCollegeName(temp);
//合并相同key的value
newCollege.setCountNum(tempMap.get(temp).getCountNum() + College.getCountNum());
//HashMap不允许key重复,当有key重复时,前面key对应的value值会被覆盖
tempMap.put(temp,newCollege );
}else{
tempMap.put(temp,College );
}
}
//去除重复key的list
List<College> newList = new ArrayList<College>();
for(String temp:tempMap.keySet()){
newList.add(tempMap.get(temp));
}
Collections.sort(newList);
List<College> acadtoLibraryList = newList.subList(0,3);
return acadtoLibraryList;
}
4:实现举例
public static void main(String[] args) {
// 建立一个southCollege对象往里面填充3个计算机学院和4个文学院的学院对象
List<College> southCollege = new ArrayList<>();
for (int i = 0; i < 3; i++) {
College college = new College();
college.setCollegeName("计算机学院");
college.setCountNum(12);
southCollege.add(college);
}
for (int i = 0; i < 4; i++) {
College college = new College();
college.setCollegeName("文学院");
college.setCountNum(66);
southCollege.add(college);
}
// 建立一个northCollege对象往里面填充3个建筑材料学院和6个食品学院的学院对象
List<College> northCollege = new ArrayList<>();
for (int i = 0; i < 3; i++) {
College college = new College();
college.setCollegeName("建筑材料学院");
college.setCountNum(52);
northCollege.add(college);
}
for (int i = 0; i < 6; i++) {
College college = new College();
college.setCollegeName("食品学院");
college.setCountNum(88);
northCollege.add(college);
}
// 第一步,用List的addAll方法,将两个相同类型的List合并成一个List(southCollege)
southCollege.addAll(northCollege);
// 第二步,将List里相同学院名的对象进行合并,同时将countNum进行相加,最后取出countNum最大的3个
// todo
for (College college : RemoveSameKeyListUtils.getNewList(southCollege)) {
System.out.println(college.getCollegeName() + " "+college.getCountNum());
}
}
5:结果:
以上是关于List集合中的对象根据某个相同的属性,合并另外属性的主要内容,如果未能解决你的问题,请参考以下文章
Java关于list集合根据集合元素对象的某个或多个属性进行排序的工具类