【Java类集】_排序及重复元素说明笔记(实例亲测)
2013-01-24 13:24
405 查看
【Java类集】_排序及重复元素说明笔记
本章目标:
掌握TreeSet的排序原理
掌握Set接口中重复元素的定义
3.具体内容:
TreeSet类的内容是可以排序的,那么现在我任意给出一个类,观察能否进行排序的操作。
执行时出现了以下的错误:
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)
修改代码如下:
此时,去掉的重复元素并不是真正意义上的重复元素的取消。
此时,并没有去掉重复的元素,那么重复元素该如何去掉呢?
如果要想取消掉重复元素,则需要Object类中的两个方法帮助:
hashCode(); 表示一个唯一的编码,一般通过计算表示。
equals(); 进行对象的比较操作。
如果要想使用Set,则就必须注意以上的两个问题。
4.总结:
1.之前曾经强调过,一个好的类应该覆写Object类中的equals()、hashCode()、toString()三个方法,实际上在String中已经全部覆写完成了。
2.Set接口依靠hashCode()和equals()完成重复元素的判断,关于这一点在日后的Map接口中也有体现
3.TreeSet依靠Comparable接口完成排序的操作(需覆写CompareTo()方法)。
本章目标:
掌握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()方法)。
相关文章推荐
- 【Java类集】_排序及重复元素说明笔记(实例亲测)
- java类集--排序及重复元素说明
- Java类集框架——Set接口和子接口SortedSet以及SortedSet接口的子类TreeSet之间的联系和使用、排序设置重复元素的说明
- JAVA类集----Set接口排序及重复元素说明
- Java类集 _排序及重复元素说明
- Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序)
- [置顶] 算法笔记 //05_有重复元素的排列问题(针对字母排序)
- Java基础知识强化之集合框架笔记27:ArrayList集合练习之去除ArrayList集合中的重复字符串元素
- 排序及重复元素去重的说明,TreeSet,HashSet
- 【LeetCode-面试算法经典-Java实现】【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】
- java 两个相同元素的List,合并排序去除重复元素的快速算法
- Java基础知识强化之集合框架笔记44:Set集合之TreeSet保证元素唯一性和自然排序的原理和图解
- Java基础知识强化之集合框架笔记28:ArrayList集合练习之去除ArrayList集合中的重复字符串元素(升级)
- JAVA代码—算法基础:计算已排序的数组中不重复的元素个数
- 2011-12-04 15:36 JAVA实现位向量给无重复元素的整数数组排序
- (Java) LeetCode 83. Remove Duplicates from Sorted List —— 删除排序链表中的重复元素
- Java集合学习笔记(通过比较器对集合元素排序)
- (Java) LeetCode 82. Remove Duplicates from Sorted List II —— 删除排序链表中的重复元素 II
- 数据结构与算法分析笔记与总结(java实现)--链表8:对排序链表删除重复结点问题
- 【LeetCode-面试算法经典-Java实现】【026-Remove Duplicates from Sorted Array(删除排序数组中的重复元素)】