集合框架之Set TreeSet
阿新 • • 發佈:2019-05-06
compare tree ngs 通過 pareto size @override strong 否則
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 privateint 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); } }
集合框架之Set TreeSet