Хранение перечислений в сортировщике? - PullRequest
3 голосов
/ 22 октября 2010

Скажем, у меня было перечисление под названием Планеты, которое содержало ВЕНУС, ЗЕМЛЮ и МАРС.У меня будет много списков массивов, которые будут содержать не более одного каждого типа.Я хочу, чтобы каждый список массивов всегда сортировался по VENUS, EARTH и MARS.

Нужно ли использовать для этого компаратор?Есть ли способ автоматически сортировать их после вставки, или мне нужно будет вызывать сортировку после каждой вставки?Нужно ли будет хранить значение int внутри каждого типа, чтобы различать их порядок?

Если у вас есть альтернативный совет, спасибо.

Ответы [ 7 ]

3 голосов
/ 22 октября 2010

Наиболее общим решением является использование TreeSet, который сохраняет элементы в отсортированном порядке при вставке. Если вы не предоставите компаратор, он будет поддерживать «естественный порядок», который для перечислений является порядком, в котором они были объявлены. Поскольку этот порядок подвержен изменениям, лучше всего объявить TreeSet с помощью собственного компаратора. который заказывает их по мере необходимости.

Конечно, если у вас есть только 3 перечисления, и в каждой коллекции не более одного из них, вы можете быть ленивыми и вручную поместить их в EnumSet в правильном порядке, но TreeSet, вероятно, является "правильным" подходом для долгосрочный.

3 голосов
/ 22 октября 2010

У меня будет много списков массивов, которые будет держать не более одного каждого типа. я хочу сохранить каждый список массивов отсортированным в все времена

То, что вы описываете, это SortedSet (например, TreeSet), не a List.

Чтобы определить порядок сортировки, вам просто нужно поместить константы перечисления в правильный порядок при их определении. Если вы не хотите этого делать или вам нужен другой порядок сортировки, вы можете использовать Comparator в качестве аргумента конструктора для TreeSet.

В качестве альтернативы вы можете использовать EnumSet, который не реализует SortedSet, но также перебирает содержимое в порядке, в котором объявлены константы перечисления. Это также очень быстро и эффективно использует память.

2 голосов
/ 22 октября 2010

Из Java Doc

Сравнивает это перечисление с указанным объектом для заказа. Возвращает отрицательное целое число, ноль или положительное целое число, так как этот объект меньше, равен или больше указанного объекта. Константы перечисления сравнимы только с другими константами перечисления того же типа. Естественный порядок, реализованный этим методом, является порядком, в котором объявлены константы.

Так что, если это нормально, вам не нужно реализовывать Comparator, но если вам нужен алфавитный алфавит, вам потребуется.

0 голосов
/ 22 октября 2010

Также обратите внимание, что у перечислений есть «порядковый» метод, который возвращает их позицию или порядок, в котором это значение определено.

0 голосов
/ 22 октября 2010

Вы можете просто использовать EnumSet.Он сохраняет перечисления по их естественному порядку (то есть порядку, указанному в объявлении перечисления).Это документированная функция, на которую вы можете положиться.

0 голосов
/ 22 октября 2010

Заказ поддерживается перечислением.

0 голосов
/ 22 октября 2010

Как насчет Arrays.asList(Planets.values())

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