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:结果:

猜你喜欢

转载自www.cnblogs.com/xm970829/p/12888509.html