JAVA类集----Set接口排序及重复元素说明
来源:互联网 发布:2015加工贸易数据 编辑:程序博客网 时间:2024/05/16 14:45
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接口完成排序的。
- JAVA类集----Set接口排序及重复元素说明
- java类集--排序及重复元素说明
- Java类集 _排序及重复元素说明
- 【Java类集】_排序及重复元素说明笔记(实例亲测)
- 【Java类集】_排序及重复元素说明笔记(实例亲测)
- Java类集框架——Set接口和子接口SortedSet以及SortedSet接口的子类TreeSet之间的联系和使用、排序设置重复元素的说明
- Java中的Set接口,了解如何判断是否重复元素。
- 元素为自定义复合结构时 map,set 如何处理重复 key 及排序?
- java 集合 Set 插入重复元素
- JDK源码阅读之Set不重复元素集合接口
- JAVA类集----Set接口
- java类集---Set接口
- 快速排序(Java),针对重复元素
- Java中Set包含重复元素的问题
- java中set集合如何去除重复元素
- Java 中Set接口及原理
- Set集合去除重复元素
- Set实现没有重复元素
- Java异常的概念和分类
- a、b交换不用参数
- 爱情如河
- Controller接口控制器详解
- 伟大的毕达哥拉斯
- JAVA类集----Set接口排序及重复元素说明
- 第一阶段总结--5个实例背后的数据库
- oracle10g 卸载
- Javascript的闭包理解
- 答案与结果
- C# 中的委托和事件
- 克鲁斯卡尔(Kruskal)算法
- 不显示删除回复显示所有回复显示星级回复显示得分回复 触发器问题:如何记录被修改的多行纪录的关键字的原值和新值?
- 规范化-数据库设计原则