淺談Comparable與Comparator的區別

最近一直在複習Java的集合部分的東西,老師講了很多,很受啓發,在這裏就簡單的說說自己對於Comparable與Comparator的理解。

首先先來看看他們的使用:

先來看看Comparator的使用

將字符串數組按照字典順序表排序:

public class StringSort {
 public static void main(String[] args) {
  String demos[]={"hello","chenhj","test","中國"};
  Arrays.sort(demos, new StringComparator());//在這裏調用這個方法正是爲了將制定的數組,按照一個自定義的排序器進行排
  for(String str:demos){
   System.out.println(str);
  }
 }
}

接下來就是排序器的自定義

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class StringComparator implements Comparator<String>{
 @Override
 public int compare(String o1, String o2) {
  // TODO Auto-generated method stub
  return o1.compareTo(o2);//重新定義比較的方法
 } 
}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

再來看看Comparable的使用

將利用TreeMap將其中的數據按照某種規則進行排序:

 

Code類:

public class Code implements Comparable<Code>{
 private Integer id;
 public Code(Integer id) {
  this.id=id;
 }
 @Override
 public boolean equals(Object obj) {
  if(obj==null){
   return false;
  }
  if(obj instanceof Code){
   Code c=(Code)obj;
   if(c.id==this.id){
    return true;
   }
  }
  return false;
 }
 @Override
 public int hashCode() {
  
  return id;
 }
 @Override
 public String toString() {
  return "Code [id=" + id + "]";
 }

//重寫其中的方法
 @Override
 public int compareTo(Code o) {
  if(this.id>o.id){
   return -1;
  }else if(this.id==o.id){
   return 0;
  }else if(this.id<o.id){
   return 1;
  }
  return 0;
 }
}

 

Person類:

public class Person {
 private Code id;//身份
 private String name;
 
 public Person(String name,Code id) {
  this.name=name;
  this.id=id;
 }
 
 @Override
 public boolean equals(Object obj) {
  if(obj==null){
   return false;
  }
  if(obj instanceof Person){
   Person p=(Person)obj;
   if(p.id==this.id){
    return true;
   }
  }
  return false;
 }
 @Override
 public String toString() {
  return "Person [id=" + id + ", name=" + name + "]";
 }

 public Code getId() {
  return id;
 }
 
}

 

測試類:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

public class MapDemo {
 public static void main(String[] args) {
  TreeMap<Code, Person> map = new TreeMap<Code, Person>();// 裏面的泛型約束都是引用數據類型

  Person p1 = new Person("x", new Code(11));
  Person p2 = new Person("xz", new Code(12));
  Person p3 = new Person("xx", new Code(13));
  Person p4 = new Person("xy", new Code(14));
  Person p5 = new Person("xxy", new Code(11));

  map.put(p1.getId(), p1);
  map.put(p2.getId(), p2);
  map.put(p3.getId(), p3);
  map.put(p4.getId(), p4);
  map.put(p5.getId(), p5);

  Set<Entry<Code, Person>> entrys = map.entrySet();// 返回映射項的set視圖
  Iterator<Entry<Code, Person>> its = entrys.iterator();
  while (its.hasNext()) {
   Entry<Code, Person> entry = its.next();
   System.out.println(entry.getKey() + "->" + entry.getValue());
  }
 }
}

 

看完兩個不同的接口之後,我們從運行結果可以看出,一個是將字符串數組進行了排序,而另一個則是根據Code的id字段的值進行了排序。那麼同樣都是排序,他們之間,到底有什麼區別呢?

總結一下就是:

Comparable是一個對象本身就已經支持自比較所需要實現的接口(如String Integer自己就可以完成比較大小操作)

而Comparator是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足你的要求時,你可以寫一個比較器來完成兩個對象之間大小的比較。
    comparable是通用的接口,用戶可以實現它來完成自己特定的比較,而comparator可以看成一種算法的實現,在需要容器集合collection需要比較功能的時候,來指定這個比較器,這可以看出一種設計模式  
   comparable應該比較固定,和一個具體類相綁定,而comparator比較靈活,它可以被用於各個需要比較功能的類使用。可以說前者屬於“靜態綁定”,而後者可以“動態綁定”。
  一個類實現了Camparable接口表明這個類的對象之間是可以相互比較的。如果用數學語言描述的話就是這個類的對象組成的集合中存在一個全序。這樣,這個類對象組成的集合就可以使用Sort方法排序了。
  而Comparator的作用有兩個:
  1. 如果類的設計師沒有考慮到Compare的問題而沒有實現Comparable接口,可以通過 Comparator來實現比較算法進行排序
  2. 爲了使用不同的排序標準做準備,比如:升序、降序或其他什麼序

 

 

發佈了35 篇原創文章 · 獲贊 21 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章