Заповнення списку всіма значеннями переліку в Java


80

Я хотів би заповнити список усіма можливими значеннями перерахування.
Оскільки я нещодавно закохався EnumSet, я взяв на себе зусилляallOf()

EnumSet<Something> all = EnumSet.allOf( Something.class);
List<Something> list = new ArrayList<>( all.size());
for (Something s : all) {
    list.add( s);
}
return list;

Чи є кращий спосіб (як у не затуманеного одного лайнера) досягти того самого результату?


ArrayList <Something> list = new ArrayList <Something> (Arrays.asList (Something.values ​​()))
TacB0sS

Відповіді:


169

Я б не використовував Список спочатку, оскільки EnumSet є більш відповідним, але Ви можете це зробити

List<Something> somethingList = Arrays.asList(Something.values());

або

List<Something> somethingList =
                 new ArrayList<Something>(EnumSet.allOf(Something.class));

3
Іноді EnumSet не вирізає його. Зокрема, коли порядок має значення
MonoThreaded

1
@MonoThreaded Яке замовлення ви мали на увазі? EnumSet знаходиться в природному порядку для переліку. Список буде в тому ж порядку, що і набір, тому використання списку тут нічого не змінює.
Пітер Лорі

1
На жаль, замовлення поза цим питанням. Я вважаю, що ви мали на увазі значення () у першому прикладі.
MonoThreaded

@PeterLawrey ми постійно використовуємо Enums. Коли ми розробляємо робочий процес, процес затвердження може не рухатися в Natural OrderEnum, ось чому a List<Enum>стає в нагоді проти an EnumSet.
buzzsawddog

EnumSetне має get()методу (легкий довільний доступ), хоча Listмає. Це може бути важливим для того, для чого List / EnumSet призначений для використання
pallgeuer


10

Існує конструктор, для ArrayListякого є

ArrayList(Collection<? extends E> c) 

Тепер EnumSetрозширюється, AbstractCollectionщоб ви могли просто зробити

ArrayList<Something> all = new ArrayList<Something>(enumSet)

8

спробуй

enum E {
    E1, E2, E3
}

public static void main(String[] args) throws Exception {
    List<E> list = Arrays.asList(E.values());
    System.out.println(list);
}

Некрасивий макет, але приємний підхід :)
MonoThreaded

варто пояснити, що ви не отримуєте з цього списку java.util.ArrayList, як зазначено у питанні
planetjones

@MonoThreaded, як це негарно? ви отримуєте те, про що просили
CA Arefe

1
List<Something> result = new ArrayList<Something>(all);

EnumSetє колекцією Java, оскільки вона реалізує Setінтерфейс:

public interface Set<E> extends Collection<E> 

Отже, все, що ви можете зробити з колекцією, ви можете зробити з EnumSet.



0

Спробуйте це:

... = new ArrayList<Something>(EnumSet.allOf(Something.class));

як ArrayListі конструктор з Collection<? extends E>. Але використовуйте цей метод, лише якщо ви дійсно хочете скористатися ним EnumSet.

Усі перелічені мають доступ до методу values(). Він повертає масив усіх значень переліку:

... = Arrays.asList(Something.values());

0

Ви також можете використовувати:

Collections.singletonList(Something.values())

Я отримую hexCode
P

-2
private ComboBox gender;
private enum Selgender{Male,Famle};
ObservableList<Object> observableList  =FXCollections.observableArrayList(Selgender.values());
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.