我正在尋找一種方法來查找運行時是否訂購集合。任何方式來做到這一點?Java - 查找是否訂購集合的一種方法
編輯:我很抱歉錯誤地問了問題。我的意思是說是否存在一些通用的方式來說HashMap不會存儲被插入的元素的順序,這是LinkedHashMap的作用。
我正在尋找一種方法來查找運行時是否訂購集合。任何方式來做到這一點?Java - 查找是否訂購集合的一種方法
編輯:我很抱歉錯誤地問了問題。我的意思是說是否存在一些通用的方式來說HashMap不會存儲被插入的元素的順序,這是LinkedHashMap的作用。
對於實現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;
}
+1爲通用。如果你想用一個已經實現了Comparable的對象來使用它,你需要編寫一些[Adapter](http://en.wikipedia.org/wiki/Adapter_pattern)(或者已經存在於JDK中的) '比較()'對象本身。 – ArtB
假設它是一個List
,這應該這樣做:-)
它的每一項進行比較(除了最後一個 - 這將是由倒數第二項檢查)和檢查的下一個項目是否是小。如果是這種情況,那麼它不會被排序。
for (int i = 0; i < collection.size() - 1; i++)
{
if (collection.get(i).compareTo(collection.get(i+1)) > 0)
{
// NOT SORTED
break;
}
}
+1用'compareTo()'替換'>'並檢查它是否大於0. –
從技術上講,只有List接口允許排序。所以你的測試應該檢查集合是否可以被轉換爲List。 –
@ jordan002:還有其他排序的集合類型,即SortedSet,並且可以有任何數量的支持排序的自定義集合類型。 – x4u
採用了可愛和流行Guava libraries,這是一個高度可讀的一行:
return Ordering.natural().isOrdered(collection);
如果你的元素是根據一些其他比較器進行排序,而不是他們的自然順序:
return Ordering.from(comparator).isOrdered(collection);
按'ordered',你的意思是'sorted'嗎? –
它包含什麼樣的數據? –
我不認爲技術上說可以訂購一個「集合」,因爲集合的一般合同並不保證商品會保持一致的順序,但是列表確實是這樣,所以大概你是指列表。 – ArtB