TreeSet是Set接口的实现类,底层数据结构是二叉树。
TreeSet的存储方式按照一定的规则。存储规则让数据表现出自然顺序。
TreeSet(二叉树)工作原理
添加一个新元素t的存储步骤:
[1] 如果集合无元素,t直接加入;如果集合有元素,t和根节点比较;
[2] 如果t小于根节点;把t放到根节点的左子树上;重复1-3步骤
[3] t大于根节点;把t放到根节点的右子树上;重复1-3步骤
输出时按照一定的规则:左子树->根节点->右子树
根据TreeSet的工作原理,向TreeSet添加自定义元素?
向TreeSet中添加元素时,一定要提供比较策略,否则会出现ClassCastException。
比较策略分为两种: 内部比较器和外部比较器。
内部比较器:
在自定义对象,实现comparable接口,并实现compareTo方法。通过指定的方法策略,完成对象元素比较,再进行存储。
比较方法1:
1 public class Student implements Comparable<Student> { 2 private int id; 3 private String name; 4 private int age; 5 6 public int getId() { 7 return id; 8 } 9 10 public void setId(int id) { 11 this.id = id; 12 } 13 14 public String getName() { 15 return name; 16 } 17 18 public void setName(String name) { 19 this.name = name; 20 } 21 22 public int getAge() { 23 return age; 24 } 25 26 public void setAge(int age) { 27 this.age = age; 28 } 29 30 @Override 31 public int compareTo(Student o) { 32 if(this.getAge()<o.getAge()){ 33 return -1; //-1表示升序排序 34 }else if(this.getAge()==o.getAge()){ 35 return 0; //0表示不添加存储 36 }else { 37 return 1; //1表示降序 38 } 39 40 } 41 42 43 }
比较方法2:
public class Student implements Comparable<Student> { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(Student o) { /*return this.getAge()-o.getAge(); //升序 */ return o.getAge()-this.getAge();//降序 } }
比较方法3: 当年龄相等的时候,比较其他属性。
1 public class Student implements Comparable<Student> { 2 private int id; 3 private String name; 4 private int age; 5 6 public int getId() { 7 return id; 8 } 9 10 public void setId(int id) { 11 this.id = id; 12 } 13 14 public String getName() { 15 return name; 16 } 17 18 public void setName(String name) { 19 this.name = name; 20 } 21 22 public int getAge() { 23 return age; 24 } 25 26 public void setAge(int age) { 27 this.age = age; 28 } 29 30 @Override 31 public int compareTo(Student o) { 32 if(this.getAge()<o.getAge()){ 33 return -1; 34 }else if(this.getAge()== o.getAge()){ 35 return this.getName().compareTo(o.getName()); 36 }else{ 37 return 1; 38 } 39 40 } 41 }
外部比较器:
当实际开发过程中,不知道添加元素的源代码,无权修改别人的代码,此时可以使用外部比较器。
比较方法1:使用外部类
1 public class Day1 { 2 3 public static void main(String[] args) { 4 LanComparator lanComparator=new LanComparator(); 5 TreeSet<String> set=new TreeSet<String>(); 6 set.add("zhangsan"); 7 set.add("lisi"); 8 set.add("wangwu"); 9 10 set.add("lisi"); 11 System.out.println(set); 12 13 } 14 15 } 16 class LanComparator implements Comparator<String>{ 17 18 @Override 19 public int compare(String o1, String o2) { 20 21 return o1.length()-o2.length(); 22 } 23 24 }
比较方法2: 使用匿名内部类
public class Day1 { public static void main(String[] args) { /*LanComparator lanComparator=new LanComparator();*/ TreeSet<String> set=new TreeSet<String>(new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.length()-o2.length(); } }); set.add("zhangsan"); set.add("lisi"); set.add("wangwu"); set.add("lisi"); System.out.println(set); } }
原文地址:https://www.cnblogs.com/luojack/p/10817272.html
时间: 2024-10-25 23:38:48