【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()方法)。