Java类集 _排序及重复元素说明
来源:互联网 发布:泰坦之旅 知乎 编辑:程序博客网 时间:2024/06/05 08:45
1、掌握TreeSet 的排序原理
2、掌握Set 接口中重复元素的定义
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 gtoString(){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("王五",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) ;}};执行时出现了以下错误:
Exception in thread "main" java.lang.ClassCastException: Person cannot be cast t
o java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1188)
at java.util.TreeMap.put(TreeMap.java:531)
at java.util.TreeSet.add(TreeSet.java:255)
at TreeSetDemo02.main(TreeSetDemo02.java:17)
Comparable 之前曾经讲解过主要是进行排序的操作接口,一个对象数组要想排序,则依靠Comparable 接口完成。那么对于TreeSet 也一样,如果要想使用TreeSet 进行排序的操作,则对象所在的类也必须实现Comparable 接口。
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 ;}public int compareTo(Person per){if(this.age>per.age){return 1 ;}else if(this.age<per.age){return -1 ;}else{return 0 ;}}};public class TreeSetDemo03{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("王五",32)) ;allSet.add(new Person("赵六",33)) ;allSet.add(new Person("孙七",33)) ;System.out.println(allSet) ;}};String 类既然可以使用TreeSet 排序,则String 中肯定已经实现了Comparable 接口
此时,是可以排序了,但是结果有问题。
[姓名:张三;年龄:30,姓名:李四;年龄:31,姓名:王五;年龄:32,姓名:赵六;年龄:33]
发现在此时去掉了重复的元素,但是依靠的是Comparable 接口完成的。孙七没有加入进来,因为两个的年龄是完全一样的,而此时的 Comparable 接口比较的只是年龄,所以为了保证正确,所有的属性都应该进行比较:
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 ;}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 class TreeSetDemo04{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("王五",32)) ;allSet.add(new Person("赵六",33)) ;allSet.add(new Person("孙七",33)) ;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 ;}};public class RepeatDemo01{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) ;}};此时,并没有去掉重复的元素,那么重复元素该如何取消呢:
如果要想取消掉重复元素,则需要Object 类中的两个方法帮助
hashCode():表示一个唯一的编码,一般通过计算表示
equals():进行对象的比较操作。
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 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("王五",32)) ;allSet.add(new Person("赵六",33)) ;allSet.add(new Person("孙七",33)) ;System.out.println(allSet) ;}};如果要想使用 Set,则就必须注意以上的两个问题。
总结:
1、之前曾经强调过:一个好的类应该覆写Object 类中的equals()、hashCode()、toString() 三个方法,实际上在String 中已经全部覆写完成了
2、Set 接口依靠hashCode() 和equals() 完成重复元素的判断,关于这一点在日后的Map 接口中也有体现
3、TreeSet 依靠 Comparable 接口完成排序的操作。
- Java类集 _排序及重复元素说明
- java类集--排序及重复元素说明
- 【Java类集】_排序及重复元素说明笔记(实例亲测)
- 【Java类集】_排序及重复元素说明笔记(实例亲测)
- JAVA类集----Set接口排序及重复元素说明
- 快速排序(Java),针对重复元素
- java数组元素重复次数及重复次数的最大值
- 排序单链表去重复元素
- Java实现-删除排序链表的重复元素1
- Java实现-删除排序链表中的重复元素2
- 20170819_去除掉重复元素使其唯一并排序
- 算法笔记 //05_有重复元素的排列问题(针对字母排序)
- 重复元素排序问题--递归
- Add Again(重复元素排序)
- 删除排序链表中重复元素
- java去除重复元素
- java 两个相同元素的List,合并排序去除重复元素的快速算法
- Java中ArrayList的去重复及排序
- Webservice 是什么?
- repo 的用法
- U-BOOT之三:u-boot移植一
- FlexPaper 实现百度文库式应用
- Android 个人通讯录【安卓进化十四】
- Java类集 _排序及重复元素说明
- 动态对话框的创建
- Flex和js相互调用
- 视频管理模块代码总结 (2)flash视频播放源码
- 我的暑假我做主
- ossim细节经验积累
- 笔记本屏幕颜色校证,有效解决屏幕发白、刺眼问题
- 对思维导图的认识
- java toString、String.valueOf 、(String) 的区别