java集合對象根據多個字段去重

大家很關心的結果來了,之前我們要去重對象中的重複的數據 可能需要兩個for循環,從今天開始就不再需要了。
昨天看了一篇文章說TreeSet能去重多個,我知道能去重一次,後來測試研究如下:

// 這是查看的文章
List<User> list = new ArrayList<>();
list.add(new User("李白","123",1));
list.add(new User("李白1","1234",1));
list.add(new User("李白1","1234",1));
list.add(new User("李白","123",1));
for(User u : list){
    System.out.println("去重前的數據" + u);
}
Set<User> set = new TreeSet<>(new Comparator<User>() {
    @Override
    public int compare(User user0, User t1) {
        int count = 1;
        if(StringUtils.equals(user0.getUsername(), t1.getUsername()) &&
                StringUtils.equals(user0.getPassword(),t1.getPassword())){
            count = 0;
        }
        return count;
    }
});
set.addAll(list);
System.out.println("________________");
for(User u : set){
    System.out.println("去重後的數據" + u);
}

打印結果如下:
去重前的數據User{username='李白', password='123', age=1}
去重前的數據User{username='李白1', password='1234', age=1}
去重前的數據User{username='李白1', password='1234', age=1}
去重前的數據User{username='李白', password='123', age=1}
________________
去重後的數據User{username='李白', password='123', age=1}
去重後的數據User{username='李白1', password='1234', age=1}

我發現他這方法有點問題,如果我把集合中的值改變,如下:

List<User> list = new ArrayList<>();
list.add(new User("李白","123",1));
list.add(new User("李白1","1234",1));
list.add(new User("李白1","12345",1));
list.add(new User("李白","123",1));
for(User u : list){
    System.out.println("去重前的數據" + u);
}
Set<User> set = new TreeSet<>(new Comparator<User>() {
    @Override
    public int compare(User user0, User t1) {
        int count = 1;
        if(StringUtils.equals(user0.getUsername(), t1.getUsername()) &&
                StringUtils.equals(user0.getPassword(),t1.getPassword())){
            count = 0;
        }
        return count;
    }
});
set.addAll(list);
System.out.println("________________");
for(User u : set){
    System.out.println("去重後的數據" + u);
}

到此我只改變了list中第三條數據,接下來看一下打印結果:

去重前的數據User{username='李白', password='123', age=1}
去重前的數據User{username='李白1', password='1234', age=1}
去重前的數據User{username='李白1', password='12345', age=1}
去重前的數據User{username='李白', password='123', age=1}
________________
去重後的數據User{username='李白', password='123', age=1}
去重後的數據User{username='李白1', password='1234', age=1}
去重後的數據User{username='李白1', password='12345', age=1}
去重後的數據User{username='李白', password='123', age=1}

這樣就不滿足我們的需求了

重要方法如下

我把它稍微修改了一下

List<User> list = new ArrayList<>();
list.add(new User("李白","123",1));
list.add(new User("李白1","1234",1));
list.add(new User("李白1","1235",1));
list.add(new User("李白","123",1));
for(User u : list){
    System.out.println("去重前的數據" + u);
}

Set<User> set = new TreeSet<>(new Comparator<User>() {
    @Override
    public int compare(User user0, User t1) {
        int count = 1;//=0表示去重
		count = user0.getUsername().compareTo(t1.getUsername()) +
				user0.getPassword().compareTo(t1.getPassword());
        return count;
    }
});
set.addAll(list);
System.out.println("________________");
for(User u : set){
    System.out.println("去重後的數據" + u);
}

顯示結果如下

去重前的數據User{username='李白', password='123', age=1}
去重前的數據User{username='李白1', password='1234', age=1}
去重前的數據User{username='李白1', password='1235', age=1}
去重前的數據User{username='李白', password='123', age=1}
________________
去重後的數據User{username='李白', password='123', age=1}
去重後的數據User{username='李白1', password='1234', age=1}
去重後的數據User{username='李白1', password='1235', age=1}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章