【Java类集】_排序及重复元素说明笔记(实例亲测)

【Java类集】_排序及重复元素说明笔记

本章目标:

掌握TreeSet的排序原理
掌握Set接口中重复元素的定义

3.具体内容:

TreeSet类的内容是可以排序的,那么现在我任意给出一个类,观察能否进行排序的操作。

import java.util.Set;
import java.util.TreeSet;

class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;    
    }
    public String toString(){
        return "姓名:"+this.name+";年龄:"+this.age;        
    }

}


public class TreeSetDemo02{
    public static void main(String args[]){
        Set<Person> allSet = new TreeSet<Person>();
        allSet.add(new Person("张三",30));
        allSet.add(new Person("李四",31));
        allSet.add(new Person("王五",31));
        allSet.add(new Person("王五",32));
        allSet.add(new Person("赵六",33));
        allSet.add(new Person("孙七",34));
        allSet.add(new Person("张三",35));
        System.out.println(allSet);
    }
}



执行时出现了以下的错误:

Exception in thread "main" java.lang.ClassCastException: Person cannot be cast t
o java.lang.Comparable
        at java.util.TreeMap.put(Unknown Source)
        at java.util.TreeSet.add(Unknown Source)
        at TreeSetDemo02.main(TreeSetDemo02.java:22)

修改代码如下:

import java.util.Set;
import java.util.TreeSet;

class Person implements Comparable<Person>{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;    
    }
    public String toString(){
        return "姓名:"+this.name+";年龄:"+this.age+"\n";        
    }
    public int compareTo(Person per){//此方法一定要与equals区分开,虽然容易混淆
        if(this.age>per.age){
            return 1;
        }else if(this.age<per.age){
            return 0;
        }else{
            return this.name.compareTo(per.name);//调用String中的compareTo()方法
        }
    }
}

public class TreeSetDemo02{
    public static void main(String args[]){
        Set<Person> allSet = new TreeSet<Person>();
        allSet.add(new Person("张三",30));
        allSet.add(new Person("李四",31));
        allSet.add(new Person("王五",31));
        allSet.add(new Person("王五",32));
        allSet.add(new Person("赵六",33));
        allSet.add(new Person("孙七",34));
        allSet.add(new Person("张三",35));
        System.out.println(allSet);
    }
}



此时,去掉的重复元素并不是真正意义上的重复元素的取消。

import java.util.Set;
import java.util.HashSet;

class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;    
    }
    public String toString(){
        return "姓名:"+this.name+";年龄:"+this.age+"\n";        
    }

}


public class TreeSetDemo03{
    public static void main(String args[]){
        Set<Person> allSet = new HashSet<Person>();
        allSet.add(new Person("张三",30));
        allSet.add(new Person("李四",31));
        allSet.add(new Person("王五",32));
        allSet.add(new Person("王五",32));
        allSet.add(new Person("赵六",33));
        allSet.add(new Person("孙七",34));
        allSet.add(new Person("张三",35));
        System.out.println(allSet);
    }
}




此时,并没有去掉重复的元素,那么重复元素该如何去掉呢?

如果要想取消掉重复元素,则需要Object类中的两个方法帮助:

hashCode();    表示一个唯一的编码,一般通过计算表示。
equals();    进行对象的比较操作。

import java.util.Set;
import java.util.TreeSet;

class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;    
    }
    public String toString(){
        return "姓名:"+this.name+";年龄:"+this.age;        
    }
    public boolean equals(Object obj){//覆写equals,完成对象比较
        if(this==obj){
            return true;                
        }
        if(!(obj  instanceof Person)){
            return false;
        }
        Person p = (Person)obj;//向下转型
        if(this.name.equals(p.name)&&this.age==p.age){
            return true;
        }else{
            return false;
        }
    }
    public int hashCode(){
        return this.name.hashCode()*this.age;    
    }
    public String toString(){
        return "姓名:"+this.name+";年龄:"+this.age;
    }
}

public class RepeatDemo02{
    public static void main(String args[]){
        Set<Person> allSet = new HashSet<Person>();
        allSet.add(new Person("张三",30));
        allSet.add(new Person("李四",31));
        allSet.add(new Person("王五",32));
        allSet.add(new Person("王五",32));
        allSet.add(new Person("赵六",33));
        allSet.add(new Person("孙七",34));
        allSet.add(new Person("张三",35));
        System.out.println(allSet);
    }
}


如果要想使用Set,则就必须注意以上的两个问题。

4.总结:

1.之前曾经强调过,一个好的类应该覆写Object类中的equals()、hashCode()、toString()三个方法,实际上在String中已经全部覆写完成了。
2.Set接口依靠hashCode()和equals()完成重复元素的判断,关于这一点在日后的Map接口中也有体现
3.TreeSet依靠Comparable接口完成排序的操作(需覆写CompareTo()方法)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

e421083458

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值