2012-01-19 27 views
3

我正在尋找一種方法來查找運行時是否訂購集合。任何方式來做到這一點?Java - 查找是否訂購集合的一種方法

編輯:我很抱歉錯誤地問了問題。我的意思是說是否存在一些通用的方式來說HashMap不會存儲被插入的元素的順序,這是LinkedHashMap的作用。

+1

按'ordered',你的意思是'sorted'嗎? –

+0

它包含什麼樣的數據? –

+0

我不認爲技術上說可以訂購一個「集合」,因爲集合的一般合同並不保證商品會保持一致的順序,但是列表確實是這樣,所以大概你是指列表。 – ArtB

回答

4

對於實現Comparable界面元素,你可以檢查,看看他們是否在他們的「自然」順序。

public static <T extends Comparable<? super T>> boolean isOrdered(Iterable<T> list) { 
    Iterator<T> i = list.iterator(); 
    if (i.hasNext()) { 
    T previous = i.next(); 
    while (i.hasNext()) { 
     T current = i.next(); 
     if (previous.compareTo(current) > 0) 
     return false; 
     previous = current; 
    } 
    } 
    return true; 
} 

否則,你必須定義一個Comparator可以根據您的訂單定義比較你的對象,並傳遞到測試。

public static <T> boolean isOrdered(Iterable<T> list, Comparator<? super T> c) { 
    Iterator<T> i = list.iterator(); 
    if (i.hasNext()) { 
    T previous = i.next(); 
    while (i.hasNext()) { 
     T current = i.next(); 
     if (c.compare(previous, current) > 0) 
     return false; 
     previous = current; 
    } 
    } 
    return true; 
} 
+0

+1爲通用。如果你想用一個已經實現了Comparable的對象來使用它,你需要編寫一些[Adapter](http://en.wikipedia.org/wiki/Adapter_pattern)(或者已經存在於JDK中的) '比較()'對象本身。 – ArtB

1

假設它是一個List,這應該這樣做:-)

它的每一項進行比較(除了最後一個 - 這將是由倒數第二項檢查)和檢查的下一個項目是否是小。如果是這種情況,那麼它不會被排序。

for (int i = 0; i < collection.size() - 1; i++) 
{ 
    if (collection.get(i).compareTo(collection.get(i+1)) > 0) 
    { 
     // NOT SORTED 

     break; 
    } 
} 
+2

+1用'compareTo()'替換'>'並檢查它是否大於0. –

+1

從技術上講,只有List接口允許排序。所以你的測試應該檢查集合是否可以被轉換爲List。 –

+2

@ jordan002:還有其他排序的集合類型,即SortedSet,並且可以有任何數量的支持排序的自定義集合類型。 – x4u

2

採用了可愛和流行Guava libraries,這是一個高度可讀的一行:

return Ordering.natural().isOrdered(collection); 

如果你的元素是根據一些其他比較器進行排序,而不是他們的自然順序:

return Ordering.from(comparator).isOrdered(collection);