java中根据对象属性值去重

文章讲述了Java集合框架中TreeSet如何利用Comparator进行自定义排序和自动去重,而ArrayList则需通过Collections.sort方法手动排序,去重依赖于重写equals方法。TreeSet基于红黑树,而LinkedHashSet保持插入顺序。
摘要由CSDN通过智能技术生成

TreeSet:

创建 TreeSet 对象。我们可以在创建 TreeSet 对象时传入一个实现了 Comparator 接口的比较器对象,用于按照指定规则进行排序。

例如:

public int compareTo(Student s) {
        if (this.score != s.score) {
            return s.score - this.score;
        } else {
            return this.name.compareTo(s.name);
        }
    }

重复判定:根据比较器的比较方法来进行判定,如果比较结果为0,则是同一个对象。
*删除是通过比较器来删除,如果返回为0就开始删除。    

通过比较器可以自动去重,也可用set.contains(s)来看集合中是否有于s属性值一样的对象引用。

例如:

for (int i = 0; i < 5; i++) {
            String[] str = scan.next().split(",");
            Student s = new Student(str[0], Integer.parseInt(str[1]));
            if (!set.contains(s)) {
                set.add(s);
                count++;
            }
        }

补充:

this.name.compareTo(s.name);为字符串的comparaTo方法,比较当前对象于参数对象在字典中的位置,若当前对象在参数对象字典后,返回一个正整数。代码中用此按姓氏升序排序。

Java中的有序集合类在添加元素时就已经完成了自动排序。其中比较常见的有 TreeSetLinkedHashSet,它们都实现了 SortedSet 接口并且能够自动根据元素的顺序进行排序。 TreeSet 使用红黑树作为底层数据结构,因此可以实现快速地检索和排序;LinkedHashSet 则使用链表维护元素的插入顺序,因此可保持元素的插入顺序。

也就是说TreeSet集合在添加元素时自动调用ComparaTo方法排序和去重,无需手动排序和去重。

List:

在ArrayList集合中排序需要用到Collections.sort()方法手动排序,且若要自定义排序,需要在类中实现Comparable接口并重写compareTo方法。

若要去重可以重写equals方法并调用contains方法,如下:

 Scanner scan = new Scanner(System.in);
        List<Student> set = new ArrayList<>();
        int count = 0;

        for (int i = 0; i < 5; i++) {
            String[] str = scan.next().split(",");
            Student s = new Student(str[0], Integer.parseInt(str[1]));
            if (!set.contains(s)) {
                set.add(s);
                count++;
            }
        }
        Collections.sort(set);

        System.out.println(count);
        for (Student s : set) {
            System.out.println(s);
        }

此外,List并不会根据比较器返回值为0而去重。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值