treeSet的顺序

 

import java.util.Set;  
import java.util.TreeSet;  
  
public 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 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("王五", 32));  
        allSet.add(new Person("王五", 32));  
        allSet.add(new Person("王五", 33));  
        allSet.add(new Person("赵六", 33));  
        allSet.add(new Person("孙七", 33));  
        System.out.println(allSet);  
    }  
}  

执行时出现以下错误:

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

修改如下:继承Comparable接口,覆写compareTo()方法

import java.util.Set;  
import java.util.TreeSet;  
  
public 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;  
    }  
      
    public int compareTo(Person per){  
        if(this.age < per.age){  
            return 1;  
        }else if(this.age > per.age){  
            return -1;  
        }else{  
            return 0;  
        }  
    }  
      
    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("王五", 32));  
        allSet.add(new Person("王五", 32));  
        allSet.add(new Person("王五", 33));  
        allSet.add(new Person("赵六", 33));  
        allSet.add(new Person("孙七", 33));  
        System.out.println(allSet);  
    }  
}  

此时完成了排序,但是年龄相同的元素没有了,继续修改。

 

import java.util.Set;  
import java.util.TreeSet;  
  
public 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;  
    }  
      
    public int compareTo(Person per){  
        if(this.age < per.age){  
            return 1;  
        }else if(this.age > per.age){  
            return -1;  
        }else{  
            return this.name.compareTo(per.name);   //调用String中的compareTo()方法  
        }  
    }  
      
    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("王五", 32));  
        allSet.add(new Person("王五", 32));  
        allSet.add(new Person("王五", 33));  
        allSet.add(new Person("赵六", 33));  
        allSet.add(new Person("孙七", 33));  
        System.out.println(allSet);  
    }  
}  

此时并没有去掉重复的元素,要想去掉重复元素,则需要Object类中的两个方法帮助:

 

1.hashCode():表示一个唯一的编码,一般通过计算表示

2.equals():进行对象的比较操作

import java.util.Set;  
import java.util.HashSet;  
  
public 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 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("王五", 32));  
        allSet.add(new Person("赵六", 33));  
        allSet.add(new Person("孙七", 33));  
        System.out.println(allSet);  
    }  
}  

总结:

1.一个好的类应该覆写Object类中的equals()、hashCode()、toString()方法,String类中已经覆写完成了。
2.Set接口依靠hashCode()和equals()完成重复元素的判断

3.TreeSet依靠Comparable接口完成排序的。

posted @ 2017-04-14 11:36  車輪の唄  阅读(10)  评论(0编辑  收藏  举报  来源