標籤:數組 比較 排序 效能
前言:
當我們在使用Java,應該“優選容器而不是數組”。只有在證明效能成為問題,並且切換到數組對效能提高有所協助時,你才應該使用數組。
排序:
排序必鬚根據對象的實際類型執行比較操作。一種自然的解決方案是為每種不同的類型各編寫一個不同的排序方法,但是這樣的代碼難以被新的類型所複用。
程式設計的基本目標是:“將保持不變的事物與會發生改變的事物相分離”,而這裡,不變的是通用的排序演算法,變化的是各種對象相互比較的方式。因此,不是將進行比較的代碼編寫成不同的子程式,而是使用“策略設計模式”。通過使用原則,可以將“會發生變的代碼”封裝在單獨的類中(策略對象),你可以將策略對象傳遞給總是相同的代碼(演算法),這些代碼將使用原則來完成其演算法。通過這種方式,你能夠用不同的對象表示不同的比較方式(策略),然後將它們傳遞給相同的排序代碼。
Java提供的比較功能:
第一種:是實現java.lang.Comparable介面,是你的類具有“天生”的比較能力。 此介面很簡單,只有compareTo()一個方法。此方法接受另一個Object為參數,如果當前對象小於參數則返回負值,如果相等返回零,如果當前對象大於參數則返回正值。
public int compareTo(CompType rv) {return (i < rv.i ? -1 : (1 == rv.i ? 0 : 1));}
第二種:可以建立一個實現了Comparator介面的單獨類。這是策略設計模式的一個應用執行個體。這個類有compare()和equals()兩個方。然而不一定要實現equals方法,除非有特殊的效能需要,因為無論合適建立一個類,都是間接繼承自Object,而Object帶有equals方法。所以只用需要預設的equals方法就可以滿足介面的需求了。
介面 Comparator<T>
int |
compare(T o1,T o2) 比較用來排序的兩個參數。 |
boolean |
equals(Object obj) 指示某個其他對象是否“等於”此 Comparator。 |
Java提供的排序功能:
使用內建的排序方法,就可以對任意的基本類型數組排序。也可以對任意的對象數組進行排序,只要改對象實現了Comparable介面或者具有相關的Comparator。
類 Arrays
|
sort(T[] a,Comparator<? super T> c) 根據指定比較子產生的順序對指定對象數組進行排序。 |
static
|
sort(T[] a, int fromIndex, int toIndex,Comparator<? super T> c) 根據指定比較子產生的順序對指定對象數組的指定範圍進行排序。 |
注意。String排序演算法根據詞典編排順序排序,所以大寫字母開頭的詞都放在前面輸出,然後才是小寫字母開頭。如果想忽略大小寫字母單詞都放在一起排序,那麼可以使用--
Arrays.sort(數組,String.CASE_INSENSITIVE_ORDER);
注意:Java標準類庫的排序演算法針對正排序的特殊類型進行了最佳化--針對
基本類型設計“快速排序(QuickSort)”,以及針對
對象設計的“穩定歸併排序”。所以我們完全無需擔心排序的效能,除非你可以證明
排序部分的確是程式效率的
瓶頸。
Java提供的在已排序的數組中進行尋找的功能:
如果數組已經排序好了,就可以使用Arrays.binarySearch()執行快速尋找。如果對未排序的數組使用binarySearch(),那麼將產生不可預料的結果。
當然,如果數組包含重複的元素,則無法保證找到的是這些副本中的哪一個。Java的搜尋演算法確實不是專為包含重複元素的數組而設計的。
總結:
現在的Java版本對容器的支援得到了明顯的改進,並且現在的容器除了效能之外的各個方面使得數組相形見絀。
有了額外的自動封裝機制和泛型,在容器中持有基本類型就變得易如反掌了,而這也進一步促使你用容器替換數組。因為泛型可以產生型別安全的容器,因此數組面對這一變化,已經變得毫無優勢了。
這些話題都表示:當你編程時,應該“優選容器而不是數組”。
數組之 -- 數組元素的比較、排序