Подтвердить что ты не робот

Преобразование разделенной запятыми строки в HashSet

Итак, как вы собираетесь конвертировать

String csv = "11,00,33,66,44,33,22,00,11";

к хешсету наиболее быстро оптимизированным способом.

Это список идентификаторов пользователей.

Update

Я выполнил все ответы, предоставленные через тестовую программу, где каждый метод назывался 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());
        }
    }
4b9b3361

Ответ 1

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());

Ответ 2

String[] values = csv.split(",");
Set<String> hashSet = new HashSet<String>(Arrays.asList(values));

Ответ 3

String[] array= csv.split(",");

Set<String> set = new HashSet<String>(Arrays.asList(array));

Ответ 4

Вы можете попробовать

Set<String> set= new HashSet<String>(Arrays.asList(yourString.split(",")));

Ответ 5

Попробуйте следующее:

Set<String> hashSet = new HashSet<>(Arrays.asList(csv.split(",")));

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

Ответ 6

попробовать,

String[] splitValues = csv.split(",");
Set<String> set = new HashSet<String>(Arrays.asList(splitValues));

а также используйте

CollectionUtils

collectionutils.addall();

Ответ 7

попробовать

String[] args = csv.split(",");
Set<String> set = new HashSet<String>(Arrays.asList(args));

Ответ 8

Текущий принятый ответ от @Kayaman хорош, но мне есть что добавить с веб-страницы Java API. Я не смог добавить это как комментарий к ответу из-за отсутствия достаточной репутации.

Использование StringTokenizer не рекомендуется. Он упоминается на веб-странице Java API здесь http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

StringTokenizer - это унаследованный класс, который сохраняется по соображениям совместимости, хотя его использование не рекомендуется в новом коде. Рекомендуется, чтобы любой, кто ищет эту функциональность, использовал метод split для String или пакет java.util.regex.