1. 程式人生 > >TreeSet新增自定義元素(比較)

TreeSet新增自定義元素(比較)



TreeSet新增自定義元素:
 1. 往TreeSet集合中新增元素的時候,如果元素本身具備了自然順序的特徵,那麼就按照自然排序的順序新增

 2. 新增自定義元素,這些元素沒有一個自然順序,這裡新增不進入,我們就可以來提供一個當前類的一種比較規則
 ,要【遵從】Comparable介面,實現compareTo(T o)方法

 3. 如果比較元素的時候,compareTo方法返回的是0,表示這個兩個元素是一樣的,那麼這裡不允許新增,認為
 是重複元素 (TreeSet和hashCode、equals方法沒有任何關係)

 4. 除了要求元素有自然順序,或者顯示Comparable介面之外,還有一種實現的方式,在建立TreeSet的時候
 傳入引數是一個自定義的比較器,這個比較器要求【遵從】Comparator介面

 如何建立自定義比較器:
 class 類名  implements Comparator {
 public compare(Object o1 , Object o2) {

    }
 }

【注意】
 一個自定義類【遵從】了Comparable介面,實現了compareTo方法,如果這裡又給TreeSet提供了一個比較器
 這個自定義比較器是【遵從】Comparator介面,實現了compare方法,同時存在的情況下,TreeSet預設
 使用的比較規則是【自定義比較器】規則

【下面附上程式碼便於理解】

class Worker implements Comparable<Worker> {
 int id;
 String name;
 int salary;

 public Worker(int id, String name, int salary) {
  this.id = id;
  this.name = name;
  this.salary = salary;
 }

 @Override
 public String toString() {
  return "ID:" + this.id + "name:" + this.name + "salary:" + this.salary;
 }

 //第一種:
 public int compareTo(Worker o) {
  // 返回值有三種,0 負整數 正整數
  // 當前自定義類,我們通過薪水類比較,0 表示一樣  負數表示小於  整數表示大於
  return this.salary-o.salary;
 }

}

 //2.第二種:自定義一個比較器
class MyComparator implements Comparator<Worker>{

 public int compare(Worker o1, Worker o2) {
  
  return o1.salary-o2.salary;
 }
 
}

public class TestTreeSetCompare {
 public static void main(String[] args) {
  MyComparator mc=new MyComparator();
  
  TreeSet<Worker> ts = new TreeSet<Worker>(mc);
  ts.add(new Worker(1,"smile",200));
  ts.add(new Worker(2,"book",250));
  ts.add(new Worker(3,"pencil",250));
  
  System.out.println(ts);
  ts.add(new Worker(1,"smile",20));
  System.out.println(ts);
 }
}