java容器之List+Comparable與Comparator比較

u010660276發表於2014-01-01

List分為ArrayList和LinkedList兩種。

ArrayList用於隨機訪問,他在中間插入或刪除元素低價較大;

LinkedList則長於在中間插入刪除元素。

用Collections.sort方法對list排序有兩種方法
第一種是list中的物件實現Comparable介面
.

第二種方法是根據Collections.sort過載方法來實現

如:

public class User { //此處無需實現Comparable接
	    private String name;
	    private Integer order;
	    public String getName() {
	        return name;
	    }
	    public void setName(String name) {
	        this.name = name;
	    }
	    public Integer getOrder() {
	        return order;
	    }
	    public void setOrder(Integer order) {
	        this.order = order;
	    }
	}
public class Test{
	    public static void main(String[] args) {
	        User user1 = new User();
	        user1.setName("a");
	        user1.setOrder(1);
	        User user2 = new User();
	        user2.setName("b");
	        user2.setOrder(2);
	        list = new ArrayList<user>();
                list.add(user2);
	        list.add(user1);
	        Collections.sort(list,new Comparator<user>(){
	            public int compare(User arg0, User arg1) {	                
	            	return arg0.getOrder().compareTo(arg1.getOrder());
	            }
	        });
	        for(User u : list){
	            System.out.println(u.getName());
	        }
	    }
	}
下面是List常用的方法:

		Random rand=new Random(47);
		List<String> s=new LinkedList<String>(),sub=new LinkedList<String>();
		String h=new String();
		s.contains(h);//判斷某個物件是否在列表中
		s.remove(h);//
		s.indexOf(p);//發現該物件在List中所處位置的編號
		sub=s.subList(fromIndex, toIndex);//從列表中創造出一個片段
		s.containsAll(sub);
		s.retainAll(Collection<?> c);//求s與c的交集
		s.removeAll(c);//從s中移除所有的c
		s.addAll(1,c);//在1後面新增c
		Object [] o=s.toArray();//將任意的Collection物件轉化成陣列

Comparable & Comparator 都是用來實現集合中元素的比較、排序的,只是 Comparable 是在集合內部定義的方法實現的排序,Comparator 是在集合外部實現的排序,所以,如想實現排序,就需要在集合外定義 Comparator 介面的方法或在集合內實現 Comparable 介面的方法。

Comparator位於包java.util下,而Comparable位於包   java.lang下

Comparable 是一個物件本身就已經支援自比較所需要實現的介面(如 String、Integer 自己就可以完成比較大小操作,已經實現了Comparable介面)   

 自定義的類要在加入list容器中後能夠排序,可以實現Comparable介面,在用Collections類的sort方法排序時,如果不指定Comparator,那麼就以自然順序排序,如API所說:
Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface
這裡的自然順序就是實現Comparable介面設定的排序方式。

而 Comparator 是一個專用的比較器,當這個物件不支援自比較或者自比較函式不能滿足你的要求時,你可以寫一個比較器來完成兩個物件之間大小的比較。
 
可以說一個是自已完成比較,一個是外部程式實現比較的差別而已。

用 Comparator 是策略模式(strategy design pattern),就是不改變物件自身,而用一個策略物件(strategy object)來改變它的行為。
 
比如:你想對整數採用絕對值大小來排序,Integer 是不符合要求的,你不需要去修改 Integer 類(實際上你也不能這麼做)去改變它的排序行為,只要使用一個實現了 Comparator 介面的物件來實現控制它的排序就行了。


相關文章