两个List合并去重,并排序

时间:2022-03-27 21:13:17

一:去重
在工作中,我们经常需要对两个List进行合并去重,对于List中的数据不同,有不同的处理方式。
1.List中是基础数据类型

        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();

        list1.add(new Integer(5));
        list1.add(new Integer(4));
        list1.add(new Integer(3));
        list1.add(new Integer(5));

        list2.add(new Integer(5));
        list2.add(new Integer(6));
        list2.add(new Integer(7));
        list2.add(new Integer(8));

        list1.removeAll(list2);
        list1.addAll(list2);

        System.out.println(list1);

输出结果:
[4, 3, 5, 6, 7, 8]
2.List中是关联对象
由于判断对象是否相等,需要在对象的实体类中覆写equals方法,比较麻烦,可以使用map来进行去重。
实体类:

public class Vote{
    private static final long serialVersionUID = 1L;    

    private String voteId;//   
    private Integer voteType;//  投票类型 
    private String voteSubject;//   投票主题

    getter setter 方法
}
List<Vote> list1 = new ArrayList<>();
List<Vote> list2 = new ArrayList<>();
list1.add(若干vote对象);
list2.add(若干vote对象);

//以voteId为key,vote对象为value保存到map中,由于key不可重复,所以可以达到去重的效果
Map<String,Vote> map = new HashMap<>();
for (Vote vote : list1) {
    if(vote!=null){
        map.put(vote.getVoteId(), vote);
    }
}
for (Vote vote : list2) {
    if(vote!=null){
        map.put(vote.getVoteId(), vote);
    }
}

//遍历map,将map中的vote添加到list中
List<Vote> combineResult = new ArrayList<>();
Set<Entry<String, Vote>> entryset = map.entrySet();
Iterator<Entry<String, Vote>> iter = entryset.iterator();
while (iter.hasNext()) {
    combineResult.add(iter.next().getValue());
}

二 List中对象按照某一属性排序
直接调用方法:

Collections.sort(combineResult, new Comparator<Vote>(){
    @Override
    public int compare(Vote v1, Vote v2) {
        return v1.getVoteEndTime().compareTo(v2.getVoteEndTime());
    }
});

将需要排序的属性转换为long类型的数据,在compare方法中进行比较,如果想升序排列,则v1.属性.compareTo(v2.属性);降序排列,则v2.属性.compareTo(v1.属性)。
Collections.sort方法,最终调用的还是Arrays中的mergeSort方法,在这个方法中进行了一个冒泡排序。