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

来源:互联网 发布:linux所有版本 编辑:程序博客网 时间:2024/05/19 16:51

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

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

本章目标:

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

3.具体内容:

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

[java] view plaincopyprint?
  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.         Set<Person> allSet = new TreeSet<Person>();  
  21.         allSet.add(new Person("张三",30));  
  22.         allSet.add(new Person("李四",31));  
  23.         allSet.add(new Person("王五",31));  
  24.         allSet.add(new Person("王五",32));  
  25.         allSet.add(new Person("赵六",33));  
  26.         allSet.add(new Person("孙七",34));  
  27.         allSet.add(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 plaincopyprint?
  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.         Set<Person> allSet = new TreeSet<Person>();  
  28.         allSet.add(new Person("张三",30));  
  29.         allSet.add(new Person("李四",31));  
  30.         allSet.add(new Person("王五",31));  
  31.         allSet.add(new Person("王五",32));  
  32.         allSet.add(new Person("赵六",33));  
  33.         allSet.add(new Person("孙七",34));  
  34.         allSet.add(new Person("张三",35));  
  35.         System.out.println(allSet);  
  36.     }  
  37. }  



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

[java] view plaincopyprint?
  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.         Set<Person> allSet = new HashSet<Person>();  
  21.         allSet.add(new Person("张三",30));  
  22.         allSet.add(new Person("李四",31));  
  23.         allSet.add(new Person("王五",32));  
  24.         allSet.add(new Person("王五",32));  
  25.         allSet.add(new Person("赵六",33));  
  26.         allSet.add(new Person("孙七",34));  
  27.         allSet.add(new Person("张三",35));  
  28.         System.out.println(allSet);  
  29.     }  
  30. }  




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

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

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

[java] view plaincopyprint?
  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.         Person p = (Person)obj;//向下转型  
  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.         Set<Person> allSet = new HashSet<Person>();  
  39.         allSet.add(new Person("张三",30));  
  40.         allSet.add(new Person("李四",31));  
  41.         allSet.add(new Person("王五",32));  
  42.         allSet.add(new Person("王五",32));  
  43.         allSet.add(new Person("赵六",33));  
  44.         allSet.add(new Person("孙七",34));  
  45.         allSet.add(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()方法)。
0 0
原创粉丝点击