Java - способ узнать, заказана ли коллекция или нет - PullRequest
3 голосов
/ 19 января 2012

Я ищу способ выяснить, заказана ли коллекция или нет.Любой способ сделать это?

РЕДАКТИРОВАТЬ: я прошу прощения за неправильно заданный вопрос.Я имел в виду, есть ли какой-то общий способ сказать, что HashMap не хранит порядок вставляемых элементов, как это делает LinkedHashMap.

Ответы [ 3 ]

4 голосов
/ 19 января 2012

Для элементов, которые реализуют интерфейс 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;
}
2 голосов
/ 19 января 2012

Используя прекрасные и популярные библиотеки гуавы , это легко читаемый однострочный:

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

Если ваши элементы упорядочены по другому компаратору, а не по их естественному порядку:

 return Ordering.from(comparator).isOrdered(collection);
1 голос
/ 19 января 2012

Предполагая, что это List, это должно сделать это: -)

Он сравнивает каждый элемент (кроме последнего - он будет проверен вторым последним элементом) и проверяет, меньше ли следующий элемент. Если это так, то он не отсортирован.

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

        break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...