Преобразовать строку через запятую в HashSet
Итак, как бы вы пошли о преобразовании
String csv = "11,00,33,66,44,33,22,00,11";
в хешсет самым быстрым и наиболее оптимизированным способом.
Это для списка идентификаторов пользователей.
Обновить
Я проверил все ответы, представленные в тестовой программе, где каждый метод вызывался 500 000 раз для большей строки CSV. Этот тест проводился 5 раз непрерывно (в случае, если запуск программы замедлил первоначальный метод), и я получил следующее в миллисекундах (мс):
Method One Liner-> 6597
Method Split&Iterate-> 6090
Method Tokenizer-> 4306
------------------------------------------------
Method One Liner-> 6321
Method Split&Iterate-> 6012
Method Tokenizer-> 4227
------------------------------------------------
Method One Liner-> 6375
Method Split&Iterate-> 5986
Method Tokenizer-> 4340
------------------------------------------------
Method One Liner-> 6283
Method Split&Iterate-> 5974
Method Tokenizer-> 4302
------------------------------------------------
Method One Liner-> 6343
Method Split&Iterate-> 5920
Method Tokenizer-> 4227
------------------------------------------------
static void method0_oneLiner() {
for (int j = 0; j < TEST_TIMES; j++) {
Set<String> hashSet = new HashSet<String>(Arrays.asList(csv
.split(",")));
}
}
// ———————————————————————————————–
static void method1_splitAndIterate() {
for (int j = 0; j < TEST_TIMES; j++) {
String[] values = csv.split(",");
HashSet<String> hSet = new HashSet<String>(values.length);
for (int i = 0; i < values.length; i++)
hSet.add(values[i]);
}
}
static void method2_tokenizer() {
for (int j = 0; j < TEST_TIMES; j++) {
HashSet<String> hSet = new HashSet<String>();
StringTokenizer st = new StringTokenizer(csv, ",");
while (st.hasMoreTokens())
hSet.add(st.nextToken());
}
}
10 ответов
6 других ответов великолепны тем, что они являются наиболее простым способом конвертации.
Тем не менее, так как String.split()
включает в себя регулярные выражения, и Arrays.asList
выполняет избыточное преобразование, вы можете сделать это таким образом, что может несколько улучшить производительность.
Отредактируйте, если у вас есть общее представление о том, сколько предметов у вас будет, используйте HashSet
параметр конструктора, чтобы избежать ненужного изменения размера / хэширования:
HashSet<String> myHashSet = new HashSet(500000); // Or a more realistic size
StringTokenizer st = new StringTokenizer(csv, ",");
while(st.hasMoreTokens())
myHashSet.add(st.nextToken());
String[] values = csv.split(",");
Set<String> hashSet = new HashSet<String>(Arrays.asList(values));
Ты можешь попробовать
Set<String> set= new HashSet<String>(Arrays.asList(yourString.split(",")));
Попробуй это:
Set<String> hashSet = new HashSet<>(Arrays.asList(csv.split(",")));
Но будьте осторожны, это может быть самый простой способ сделать это, но не обязательно оптимальный.
Текущий принятый ответ @Kayaman хорош, но мне есть что добавить на веб-странице Java API. Я не смог добавить это как комментарий к ответу из-за нехватки репутации.
Использование StringTokenizer не рекомендуется. Он упоминается на веб-странице API Java здесь http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html
StringTokenizer - это устаревший класс, который сохраняется по соображениям совместимости, хотя его использование не рекомендуется в новом коде. Всем, кто ищет эту функциональность, рекомендуется вместо этого использовать метод split String или пакет java.util.regex.
String[] array= csv.split(",");
Set<String> set = new HashSet<String>(Arrays.asList(array));
Пытаться,
String[] splitValues = csv.split(",");
Set<String> set = new HashSet<String>(Arrays.asList(splitValues));
а также использовать
collectionutils.addall();
С более новыми версиями Java:
import java.util.Set;
Set<String> hashSet = Set.of(csv.split(","));
Пытаться
String[] args = csv.split(",");
Set<String> set = new HashSet<String>(Arrays.asList(args));