Есть ли какой-то метод в стандартной библиотеке Java для получения наименьшего перечисления из набора перечислений? - PullRequest
4 голосов
/ 06 сентября 2011

Рассмотрим коллекцию, состоящую из перечислимых типов. Есть ли какой-нибудь библиотечный метод min (или max), который принимает эту коллекцию (или varargs) и возвращает наименьшее / наибольшее значение?

РЕДАКТИРОВАТЬ: я имел в виду естественный порядок перечислений, как определено их compare реализация Comparable.

Ответы [ 3 ]

6 голосов
/ 06 сентября 2011

Перечисления реализуют Comparable<E> (где E is Enum<E>), и их естественный порядок - это порядок, в котором объявляются константы перечисления. Вы можете использовать их реализацию Comparable по умолчанию, чтобы получить максимальные и минимальные константы, как объявлено:

public enum BigCountries {
    USA(312), INDIA(1210), CHINA(1330), BRAZIL (190);

    private int population;

    private BigCountries(int population) {
        this.population = population;
    }

}

Тогда вы можете использовать:

BigCountries first = Collections.min(Arrays.asList(BigCountries.values())); // USA
BigCountries last = Collections.max(Arrays.asList(BigCountries.values()));  //BRAZIL

Возможно, более быстрый способ - использовать прямой доступ к массиву, возвращаемому методом values():

BigCountries[] values = BigCountries.values();
System.out.println(values[0]); // USA;
System.out.println(values[values.length-1]); // BRAZIL;

Обратите внимание, что параметр, указанный в enum, не влияет на порядок.

2 голосов
/ 07 сентября 2011

Если у вас есть Set<MyEnum>, он уже должен иметь тип EnumSet. К сожалению, этот класс не предоставляет методы first и last, но он гарантирует итерацию в возрастающем порядке, поэтому вы можете надежно использовать, например, первый и последний элементы в thatSet.toArray().

1 голос
/ 06 сентября 2011

Если вы хотите сделать заказ (скажем, в алфавитном порядке), используйте собственный компаратор для любой коллекции

class MyComparator implements Comparator<MyEnumType>
{
    public int compare(MyEnumType enum1, MyEnumType enum2)
    {
        return o1.toString().compareTo(o1.toString());
    }
}

Если вы хотите сохранить заявленный порядок, поместите их в SortedSet

SortedSet<MyEnumType> set = new TreeSet<MyEnumType>();
set.add(enum1);
...