Как инициализировать значения HashSet по построению?

FIND_IN_SET является вашим другом в этом случае

select * from shirts where FIND_IN_SET(1,colors) 

658
задан Serg 3 November 2018 в 22:47
поделиться

6 ответов

Существует сокращение, которое я использую, это не очень эффективно, но подходит для одной строки :

Set<String> h = new HashSet<>(Arrays.asList("a", "b"));

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

При инициализации статических окончательных наборов я обычно пишу так:

public static final String[] SET_VALUES = new String[] { "a", "b" };
public static final Set<String> MY_SET = new HashSet<>(Arrays.asList(SET_VALUES));

немного менее уродливая и эффективность не имеет значения для статической инициализации.

882
ответ дан 22 November 2019 в 21:42
поделиться

Существует сокращение, что я использую, это не очень время, не очень эффективно, но вписывается в одну строку:

Set<String> h = new HashSet<>(Arrays.asList("a", "b"));

снова, это не эффективное время, поскольку вы строите массив, конвертируя в список и используя этот список для Создать набор.

При инициализации статических окончательных наборов я обычно пишу так:

public static final String[] SET_VALUES = new String[] { "a", "b" };
public static final Set<String> MY_SET = new HashSet<>(Arrays.asList(SET_VALUES));

чуть менее уродливая и эффективность не имеет значения для статической инициализации.

-121--1777975-

немного запутанный, но работает из Java 5:

Set<String> h = new HashSet<String>(Arrays.asList(new String[] {  
    "a", "b"
}))

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

Set<String> h = asSet ("a", "b");

public Set<String> asSet(String... values) {
    return new HashSet<String>(java.util.Arrays.asList(values));
}
3
ответ дан 22 November 2019 в 21:42
поделиться

Есть несколько способов:

Инициализация двойной скобки

Это методика, которая создает анонимный внутренний класс, который имеет инициализатор экземпляра, который добавляет строку , при создании экземпляра:

Set<String> s = new HashSet<String>() {{
    add("a");
    add("b");
}}

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

Метод утилиты

Написание метода, который возвращает набор , который инициализируется нужными элементами, не слишком сложно, чтобы написать:

public static Set<String> newHashSet(String... strings) {
    HashSet<String> set = new HashSet<String>();

    for (String s : strings) {
        set.add(s);
    }
    return set;
}

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

Используйте библиотеку

Многие библиотеки имеют удобный метод для инициализации объектов коллекций.

Например, Google Collections имеет метод Sets.newhashSet (T ...) , который заполнит HashSet с элементами определенного типа.

87
ответ дан 22 November 2019 в 21:42
поделиться

Коллекционные литералы были запланированы для Java 7, но не сделали его. Так что ничего не так автоматически.

Вы можете использовать множество Guava :

Sets.newHashSet("a", "b", "c")

или можно использовать следующий синтаксис, который создаст анонимный класс, но это хаки:

Set<String> h = new HashSet<String>() {{
    add("a");
    add("b");
}};
348
ответ дан 22 November 2019 в 21:42
поделиться

Вы можете сделать это на Java 6:

Set<String> h = new HashSet<String>(Arrays.asList("a", "b", "c"));

Но почему? Я не нахожу это более читабельным, чем явное добавление элементов.

27
ответ дан 22 November 2019 в 21:42
поделиться

Обобщение служебной функции coobird answer для создания нового HashSets:

public static <T> Set<T> newHashSet(T... objs) {
    Set<T> set = new HashSet<T>();
    for (T o : objs) {
        set.add(o);
    }
    return set;
}
14
ответ дан 22 November 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: