FIND_IN_SET является вашим другом в этом случае
select * from shirts where FIND_IN_SET(1,colors)
Существует сокращение, которое я использую, это не очень эффективно, но подходит для одной строки :
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));
немного менее уродливая и эффективность не имеет значения для статической инициализации.
Существует сокращение, что я использую, это не очень время, не очень эффективно, но вписывается в одну строку:
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));
}
Есть несколько способов:
Инициализация двойной скобки
Это методика, которая создает анонимный внутренний класс, который имеет инициализатор экземпляра, который добавляет строку
, при создании экземпляра:
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
с элементами определенного типа.
Коллекционные литералы были запланированы для Java 7, но не сделали его. Так что ничего не так автоматически.
Вы можете использовать множество Guava
:
Sets.newHashSet("a", "b", "c")
или можно использовать следующий синтаксис, который создаст анонимный класс, но это хаки:
Set<String> h = new HashSet<String>() {{
add("a");
add("b");
}};
Вы можете сделать это на Java 6:
Set<String> h = new HashSet<String>(Arrays.asList("a", "b", "c"));
Но почему? Я не нахожу это более читабельным, чем явное добавление элементов.
Обобщение служебной функции coobird answer для создания нового HashSet
s:
public static <T> Set<T> newHashSet(T... objs) {
Set<T> set = new HashSet<T>();
for (T o : objs) {
set.add(o);
}
return set;
}