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


分类: Java


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

本章目标:

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

3.具体内容:

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

[java]  view plain copy print ?


1. import java.util.Set;  
2. import java.util.TreeSet;  
3.   
4. class Person{  
5. private String name;  
6. private int age;  
7. public Person(String name,int age){  
8. this.name = name;  
9. this.age = age;      
10.     }  
11. public String toString(){  
12. return "姓名:"+this.name+";年龄:"+this.age;          
13.     }  
14.   
15. }  
16.   
17.   
18. public class TreeSetDemo02{  
19. public static void main(String args[]){  
20. new TreeSet<Person>();  
21. new Person("张三",30));  
22. new Person("李四",31));  
23. new Person("王五",31));  
24. new Person("王五",32));  
25. new Person("赵六",33));  
26. new Person("孙七",34));  
27. new Person("张三",35));  
28.         System.out.println(allSet);  
29.     }  
30. }





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



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)


修改代码如下:



[java]  view plain copy print ?



1. import java.util.Set;  
2. import java.util.TreeSet;  
3.   
4. class Person implements Comparable<Person>{  
5. private String name;  
6. private int age;  
7. public Person(String name,int age){  
8. this.name = name;  
9. this.age = age;      
10.     }  
11. public String toString(){  
12. return "姓名:"+this.name+";年龄:"+this.age+"\n";          
13.     }  
14. public int compareTo(Person per){//此方法一定要与equals区分开,虽然容易混淆  
15. if(this.age>per.age){  
16. return 1;  
17. else if(this.age<per.age){  
18. return 0;  
19. else{  
20. return this.name.compareTo(per.name);//调用String中的compareTo()方法  
21.         }  
22.     }  
23. }  
24.   
25. public class TreeSetDemo02{  
26. public static void main(String args[]){  
27. new TreeSet<Person>();  
28. new Person("张三",30));  
29. new Person("李四",31));  
30. new Person("王五",31));  
31. new Person("王五",32));  
32. new Person("赵六",33));  
33. new Person("孙七",34));  
34. new Person("张三",35));  
35.         System.out.println(allSet);  
36.     }  
37. }





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



[java]  view plain copy print ?


1. import java.util.Set;  
2. import java.util.HashSet;  
3.   
4. class Person{  
5. private String name;  
6. private int age;  
7. public Person(String name,int age){  
8. this.name = name;  
9. this.age = age;      
10.     }  
11. public String toString(){  
12. return "姓名:"+this.name+";年龄:"+this.age+"\n";          
13.     }  
14.   
15. }  
16.   
17.   
18. public class TreeSetDemo03{  
19. public static void main(String args[]){  
20. new HashSet<Person>();  
21. new Person("张三",30));  
22. new Person("李四",31));  
23. new Person("王五",32));  
24. new Person("王五",32));  
25. new Person("赵六",33));  
26. new Person("孙七",34));  
27. new Person("张三",35));  
28.         System.out.println(allSet);  
29.     }  
30. }






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



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



hashCode();    表示一个唯一的编码,一般通过计算表示。


equals();    进行对象的比较操作。



[java]  view plain copy print ?



    1. import java.util.Set;  
    2. import java.util.TreeSet;  
    3.   
    4. class Person{  
    5. private String name;  
    6. private int age;  
    7. public Person(String name,int age){  
    8. this.name = name;  
    9. this.age = age;      
    10.     }  
    11. public String toString(){  
    12. return "姓名:"+this.name+";年龄:"+this.age;          
    13.     }  
    14. public boolean equals(Object obj){//覆写equals,完成对象比较  
    15. if(this==obj){  
    16. return true;                  
    17.         }  
    18. if(!(obj  instanceof Person)){  
    19. return false;  
    20.         }  
    21. //向下转型  
    22. if(this.name.equals(p.name)&&this.age==p.age){  
    23. return true;  
    24. else{  
    25. return false;  
    26.         }  
    27.     }  
    28. public int hashCode(){  
    29. return this.name.hashCode()*this.age;      
    30.     }  
    31. public String toString(){  
    32. return "姓名:"+this.name+";年龄:"+this.age;  
    33.     }  
    34. }  
    35.   
    36. public class RepeatDemo02{  
    37. public static void main(String args[]){  
    38. new HashSet<Person>();  
    39. new Person("张三",30));  
    40. new Person("李四",31));  
    41. new Person("王五",32));  
    42. new Person("王五",32));  
    43. new Person("赵六",33));  
    44. new Person("孙七",34));  
    45. new Person("张三",35));  
    46.         System.out.println(allSet);  
    47.     }  
    48. }




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



    4.总结:



    1.之前曾经强调过,一个好的类应该覆写Object类中的equals()、hashCode()、toString()三个方法,实际上在String中已经全部覆写完成了。


    2.Set接口依靠hashCode()和equals()完成重复元素的判断,关于这一点在日后的Map接口中也有体现


    3.TreeSet依靠Comparable接口完成排序的操作(需覆写CompareTo()方法)。

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


    本章目标:



    掌握TreeSet的排序原理


    掌握Set接口中重复元素的定义



    3.具体内容:



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



    [java]  view plain copy print ?


    1. import java.util.Set;  
    2. import java.util.TreeSet;  
    3.   
    4. class Person{  
    5. private String name;  
    6. private int age;  
    7. public Person(String name,int age){  
    8. this.name = name;  
    9. this.age = age;      
    10.     }  
    11. public String toString(){  
    12. return "姓名:"+this.name+";年龄:"+this.age;          
    13.     }  
    14.   
    15. }  
    16.   
    17.   
    18. public class TreeSetDemo02{  
    19. public static void main(String args[]){  
    20. new TreeSet<Person>();  
    21. new Person("张三",30));  
    22. new Person("李四",31));  
    23. new Person("王五",31));  
    24. new Person("王五",32));  
    25. new Person("赵六",33));  
    26. new Person("孙七",34));  
    27. new Person("张三",35));  
    28.         System.out.println(allSet);  
    29.     }  
    30. }





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



    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)


    修改代码如下:



    [java]  view plain copy print ?



      1. import java.util.Set;  
      2. import java.util.TreeSet;  
      3.   
      4. class Person implements Comparable<Person>{  
      5. private String name;  
      6. private int age;  
      7. public Person(String name,int age){  
      8. this.name = name;  
      9. this.age = age;      
      10.     }  
      11. public String toString(){  
      12. return "姓名:"+this.name+";年龄:"+this.age+"\n";          
      13.     }  
      14. public int compareTo(Person per){//此方法一定要与equals区分开,虽然容易混淆  
      15. if(this.age>per.age){  
      16. return 1;  
      17. else if(this.age<per.age){  
      18. return 0;  
      19. else{  
      20. return this.name.compareTo(per.name);//调用String中的compareTo()方法  
      21.         }  
      22.     }  
      23. }  
      24.   
      25. public class TreeSetDemo02{  
      26. public static void main(String args[]){  
      27. new TreeSet<Person>();  
      28. new Person("张三",30));  
      29. new Person("李四",31));  
      30. new Person("王五",31));  
      31. new Person("王五",32));  
      32. new Person("赵六",33));  
      33. new Person("孙七",34));  
      34. new Person("张三",35));  
      35.         System.out.println(allSet);  
      36.     }  
      37. }


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



      [java]  view plain copy print ?


      1. import java.util.Set;  
      2. import java.util.HashSet;  
      3.   
      4. class Person{  
      5. private String name;  
      6. private int age;  
      7. public Person(String name,int age){  
      8. this.name = name;  
      9. this.age = age;      
      10.     }  
      11. public String toString(){  
      12. return "姓名:"+this.name+";年龄:"+this.age+"\n";          
      13.     }  
      14.   
      15. }  
      16.   
      17.   
      18. public class TreeSetDemo03{  
      19. public static void main(String args[]){  
      20. new HashSet<Person>();  
      21. new Person("张三",30));  
      22. new Person("李四",31));  
      23. new Person("王五",32));  
      24. new Person("王五",32));  
      25. new Person("赵六",33));  
      26. new Person("孙七",34));  
      27. new Person("张三",35));  
      28.         System.out.println(allSet);  
      29.     }  
      30. }






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



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



      hashCode();    表示一个唯一的编码,一般通过计算表示。


      equals();    进行对象的比较操作。



      [java]  view plain copy print ?


      1. import java.util.Set;  
      2. import java.util.TreeSet;  
      3.   
      4. class Person{  
      5. private String name;  
      6. private int age;  
      7. public Person(String name,int age){  
      8. this.name = name;  
      9. this.age = age;      
      10.     }  
      11. public String toString(){  
      12. return "姓名:"+this.name+";年龄:"+this.age;          
      13.     }  
      14. public boolean equals(Object obj){//覆写equals,完成对象比较  
      15. if(this==obj){  
      16. return true;                  
      17.         }  
      18. if(!(obj  instanceof Person)){  
      19. return false;  
      20.         }  
      21. //向下转型  
      22. if(this.name.equals(p.name)&&this.age==p.age){  
      23. return true;  
      24. else{  
      25. return false;  
      26.         }  
      27.     }  
      28. public int hashCode(){  
      29. return this.name.hashCode()*this.age;      
      30.     }  
      31. public String toString(){  
      32. return "姓名:"+this.name+";年龄:"+this.age;  
      33.     }  
      34. }  
      35.   
      36. public class RepeatDemo02{  
      37. public static void main(String args[]){  
      38. new HashSet<Person>();  
      39. new Person("张三",30));  
      40. new Person("李四",31));  
      41. new Person("王五",32));  
      42. new Person("王五",32));  
      43. new Person("赵六",33));  
      44. new Person("孙七",34));  
      45. new Person("张三",35));  
      46.         System.out.println(allSet);  
      47.     }  
      48. }




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



      4.总结:



      1.之前曾经强调过,一个好的类应该覆写Object类中的equals()、hashCode()、toString()三个方法,实际上在String中已经全部覆写完成了。


      2.Set接口依靠hashCode()和equals()完成重复元素的判断,关于这一点在日后的Map接口中也有体现


      3.TreeSet依靠Comparable接口完成排序的操作(需覆写CompareTo()方法)。