我正在寻找一种方法来查找运行时,是否订购了集合。有什么办法吗?
编辑:我很抱歉提出错误的问题。我的意思是说有一些通用的方法可以说HashMap不存储插入元素的顺序,而LinkedHashMap则是这样。答案 0 :(得分: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;
}
答案 1 :(得分:2)
使用可爱且受欢迎的Guava libraries,它是一个高度可读的单行内容:
return Ordering.natural().isOrdered(collection);
如果您的元素是根据其他比较器排序的,而不是它们的自然顺序:
return Ordering.from(comparator).isOrdered(collection);
答案 2 :(得分:1)
假设它是List
,应该这样做: - )
它比较每个项目(最后一项 - 它将由第二项最后一项检查)并检查下一项是否较小。如果是这种情况,则不会对其进行排序。
for (int i = 0; i < collection.size() - 1; i++)
{
if (collection.get(i).compareTo(collection.get(i+1)) > 0)
{
// NOT SORTED
break;
}
}