web-dev-qa-db-fra.com

Convertir une chaîne séparée par des virgules en un HashSet

Alors, comment feriez-vous pour convertir

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

à un hachage de la manière la plus rapide et la plus optimisée.

Il s'agit d'une liste d'ID utilisateur.

Mise à jour

J'ai exécuté toutes les réponses fournies par le biais d'un programme de test où chaque méthode a été appelée 500 000 fois pour une chaîne CSV plus grande. Ce test a été effectué 5 fois en continu (au cas où le démarrage du programme ralentirait la méthode initiale) et j'ai obtenu ce qui suit en millisecondes (ms):

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());
        }
    }
16
Menelaos Bakopoulos

Les 6 autres réponses sont excellentes, en ce sens qu'elles constituent le moyen de conversion le plus simple.

Cependant, puisque String.split() implique des expressions rationnelles et Arrays.asList effectue une conversion redondante, vous pouvez le faire de cette façon, ce qui peut améliorer quelque peu les performances.

Edit si vous avez une idée générale du nombre d'éléments que vous aurez, utilisez le paramètre constructeur HashSet pour éviter un redimensionnement/hachage inutile:

HashSet<String> myHashSet = new HashSet(500000);  // Or a more realistic size
StringTokenizer st = new StringTokenizer(csv, ",");
while(st.hasMoreTokens())
   myHashSet.add(st.nextToken());
13
Kayaman
String[] values = csv.split(",");
Set<String> hashSet = new HashSet<String>(Arrays.asList(values));
25
TheKojuEffect

Tu peux essayer

Set<String> set= new HashSet<String>(Arrays.asList(yourString.split(",")));
2
Suresh Atta
String[] array= csv.split(",");

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

La réponse actuellement acceptée par @Kayaman est bonne, mais j'ai quelque chose à ajouter à partir de la page Web de l'API Java. Je n'ai pas pu l'ajouter en tant que commentaire à la réponse car je n'ai pas assez de réputation.

L'utilisation de StringTokenizer est déconseillée. Il est mentionné sur la page Web Java API ici http://docs.Oracle.com/javase/7/docs/api/Java/util/StringTokenizer.html

StringTokenizer est une classe héritée qui est conservée pour des raisons de compatibilité, bien que son utilisation soit déconseillée dans le nouveau code. Il est recommandé que toute personne recherchant cette fonctionnalité utilise à la place la méthode de fractionnement de String ou le package Java.util.regex.
1
SagarG

Essaye ça:

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

Mais attention, c'est peut-être la façon la plus simple de le faire, mais pas nécessairement l'optimale.

1
aUserHimself

essayer

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

Arrays.stream (csv.split (",")). Collect (Collectors.toSet ());

0
dripp

essayer,

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

et aussi utiliser

CollectionUtils

collectionutils.addall();
0
newuser