Java - 如何判断集合是否有序

4

我希望在运行时找到一种方法,判断集合是否有序。有什么方法可以做到吗?

编辑:非常抱歉我之前的问题描述有误。我的意思是,是否有一种通用的方式来表明 HashMap 不存储插入元素的顺序,而 LinkedHashMap 则会存储。


1
你所说的“ordered”,是指“sorted”吗? - Eng.Fouad
它包含什么类型的数据? - dku.rajkumar
我认为从技术上讲,“集合”不能被称为有序,因为“集合”的一般契约并不保证项目将保持一致的顺序,但是“列表”确实可以,所以您可能是指“列表”。 - Sled
3个回答

5

对于实现了 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;
}

如果您想将此代码用于已经实现了Comparable接口的对象,您需要编写一些适配器(或者JDK中已经存在适配器吗?),它只是调用对象本身的compare()方法。 - Sled

2
使用受欢迎的美妙的Guava库,它是一个高度可读的一行代码:
 return Ordering.natural().isOrdered(collection);

如果您的元素是按照其他比较器而不是自然排序进行排序的:
 return Ordering.from(comparator).isOrdered(collection);

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
>替换为compareTo(),并检查它是否大于0。 - Eng.Fouad
1
从技术上讲,只有List接口允许排序。因此,您的测试应该检查集合是否可以转换为List。 - Peter Bratton
2
@jordan002:还有其他排序集合类型,例如SortedSet,还可以有任意数量支持排序的自定义集合类型。 - x4u

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接