java 實現根據對象某屬性對List中的對象元素去重

可以利用TreeSet與java8提供的stream filter對List進行去重

代碼:

public class TestRemoveDup {

    /**
     *     TreeSet的本質是一個"有序的,並且沒有重複元素"的集合,它是通過TreeMap實現的。
     *     TreeSet注意事項:
     *     如果向TreeSet集合中添加元素的時候,元素本身沒有具備自然順序的特性,並且元素所屬的類也沒有
     *     實現Comparable接口,那麼必須在創建TreeSet對象的時候傳入一個比較器;
     */
    //根據名字進行比較,相等時TreeSet會將該元素視爲重複元素,不允許添加;
    private List<Person> removeDupByName(List<Person> people) {
        Set<Person> personSet = new TreeSet<>(Comparator.comparing(Person::getName));
        personSet.addAll(people);
        return new ArrayList<>(personSet);
    }

    private List<Person> removeDupByName2(List<Person> people) {
        List<Person> unique = people.stream().collect(
                Collectors.collectingAndThen(
                        Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Person::getName))), ArrayList::new)
        );
        return unique;
    }

    //filter的使用方式爲: filter(item -> item的邏輯判斷 ) ,其中filter會保留判斷條件爲true的記錄
    private List<Person> removeDupByName3(List<Person> people) {
        List<String> names = new ArrayList<>();//用來臨時存儲person的id

        List<Person> personList = people.stream().filter(// 過濾去重
                v -> {
                    boolean flag = !names.contains(v.getName());
                    names.add(v.getName());
                    return flag;
                }
        ).collect(Collectors.toList());
        return personList;
    }
    
    public static void main(String[] args) {
        List<Person> people = new ArrayList<>();
        Person p1 = new Person("Liu",30);
        people.add(p1);
        Person p2 = new Person("Mi",36);
        people.add(p2);
        Person p3 = new Person("Liu",31);
        people.add(p3);
        TestRemoveDup testRemoveDup = new TestRemoveDup();

        List<Person> people1 = testRemoveDup.removeDupByName(people);
        List<Person> people2 = testRemoveDup.removeDupByName2(people);
        List<Person> people3 = testRemoveDup.removeDupByName3(people);
        System.out.println(people1);
        System.out.println(people2);
        System.out.println(people3);
    }
}

結果:

[Person{name='Liu', age=30}, Person{name='Mi', age=36}]
[Person{name='Liu', age=30}, Person{name='Mi', age=36}]
[Person{name='Liu', age=30}, Person{name='Mi', age=36}]

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章