Comment convertir une chaîne en une ArrayList?


101

Dans ma chaîne, je peux avoir un nombre arbitraire de mots séparés par des virgules. Je voulais que chaque mot soit ajouté dans une ArrayList. Par exemple:

String s = "a,b,c,d,e,.........";

Réponses:


251

Essayez quelque chose comme

List<String> myList = new ArrayList<String>(Arrays.asList(s.split(",")));

Démo:

String s = "lorem,ipsum,dolor,sit,amet";

List<String> myList = new ArrayList<String>(Arrays.asList(s.split(",")));

System.out.println(myList);  // prints [lorem, ipsum, dolor, sit, amet]

Cet article a été réécrit sous forme d'article ici .


9
+1: Le new ArrayList<String>()peut être redondant selon la manière dont il est utilisé. (comme dans votre exemple;)
Peter Lawrey

1
Hehe, ouais, +1 :-) C'est peut-être même juste le splitsien après: P
aioobe

Il devrait l'utiliser Arrays.toString()pour l'imprimer, mais oui.
Peter Lawrey

Le nouveau ArrayList <String> () provoque la création d'une nouvelle liste avec la liste retournée à l'intérieur. Arrays.asList (a) renvoie un objet List donc n'appelez pas new ArrayList, vous obtiendrez un comportement indésirable.
Clocker

6
Notez que vous ne pouvez pas ajouter d'éléments à la liste renvoyée par Arrays.asList. L'OP voulait avoir une ArrayList (ce qui est tout à fait raisonnable) et la construction ArrayList est nécessaire.
aioobe

32
 String s1="[a,b,c,d]";
 String replace = s1.replace("[","");
 System.out.println(replace);
 String replace1 = replace.replace("]","");
 System.out.println(replace1);
 List<String> myList = new ArrayList<String>(Arrays.asList(replace1.split(",")));
 System.out.println(myList.toString());

8
Si vous devez couper les brackets, vous pouvez le faire en une seule étape avecreplace = s1.replaceAll("^\\[|]$", "");
David Ehrmann

9

Option 1 :

List<String> list = Arrays.asList("hello");

Option 2 :

List<String> list = new ArrayList<String>(Arrays.asList("hello"));

À mon avis, Option1 est meilleure car

  1. nous pouvons réduire le nombre d'objets ArrayList créés de 2 à 1. La asListméthode crée et renvoie un objet ArrayList.
  2. ses performances sont bien meilleures (mais il renvoie une liste de taille fixe).

Veuillez vous référer à la documentation ici


Pourquoi cela ne fonctionne-t-il pas? List<Character> word1 = new ArrayList<Character>(Arrays.asList(A[0].toCharArray()));J'essaie d'obtenir la première chaîne d'un tableau de chaînes et de convertir cette chaîne en charArray et ce charArray en List <Character>
sofs1

c'est parce que, la méthode asList de la classe Arrays ne prend que le tableau Object, pas les tableaux primitifs. Si vous convertissez char [] en tableau Character [], cela fonctionnera.
Andy

public static Character [] boxToCharacter (char [] charArray) {Character [] newArray = new Character [charArray.length]; int i = 0; for (char value: charArray) {newArray [i ++] = Character.valueOf (value); } return newArray; }
Andy

8

Dans Java 9, l'utilisation List#of, qui est une liste immuable des méthodes statiques d'usine, devient plus simple.

 String s = "a,b,c,d,e,.........";
 List<String> lst = List.of(s.split(","));

s.split("\\s*,\\s*")peut être ajouté pour des soins supplémentaires
Vishwajit R. Shinde

2

Si vous importez ou si vous avez un tableau (de type string) dans votre code et que vous devez le convertir en arraylist (chaîne offcourse), alors l'utilisation des collections est meilleure. comme ça:

String array1[] = getIntent().getExtras().getStringArray("key1"); or String array1[] = ... then

List allEds = new ArrayList(); Collections.addAll(allEds, array1);

2

Ok, je vais étendre les réponses ici car beaucoup de gens qui viennent ici veulent diviser la chaîne par un espace . Voici comment procéder:

List<String> List = new ArrayList<String>(Arrays.asList(s.split("\\s+")));

2

Vous pouvez utiliser:

List<String> tokens = Arrays.stream(s.split("\\s+")).collect(Collectors.toList());

Vous devriez vous demander si vous avez vraiment besoin de ArrayList en premier lieu. Très souvent, vous allez filtrer la liste en fonction de critères supplémentaires, pour lesquels un Stream est parfait. Vous voudrez peut-être un ensemble; vous voudrez peut-être les filtrer au moyen d'une autre expression régulière, etc. Java 8 fournit cette extension très utile, d'ailleurs, qui fonctionnera sur n'importe quel CharSequence: https://docs.oracle.com/javase/8/docs/api /java/util/regex/Pattern.html#splitAsStream-java.lang.CharSequence- . Puisque vous n'avez pas du tout besoin du tableau, évitez de le créer ainsi:

// This will presumably be a static final field somewhere.
Pattern splitter = Pattern.compile("\\s+");
// ...
String untokenized = reader.readLine();
Stream<String> tokens = splitter.splitAsStream(untokenized);

1

Si vous souhaitez convertir une chaîne en ArrayList, essayez ceci:

public ArrayList<Character> convertStringToArraylist(String str) {
    ArrayList<Character> charList = new ArrayList<Character>();      
    for(int i = 0; i<str.length();i++){
        charList.add(str.charAt(i));
    }
    return charList;
}

Mais je vois un tableau de chaînes dans votre exemple, donc si vous souhaitez convertir un tableau de chaînes en ArrayList, utilisez ceci:

public static ArrayList<String> convertStringArrayToArraylist(String[] strArr){
    ArrayList<String> stringList = new ArrayList<String>();
    for (String s : strArr) {
        stringList.add(s);
    }
    return stringList;
}

Une approche plus simple basée sur les caractères serait: ArrayList <String> myList = new ArrayList <String> (); pour (Caractère c: s.toCharArray ()) {maListe.add (c.toString ()); } Mais je ne pense pas que ce soit ce que la personne recherche. La solution d'Aioobe est ce qu'il faut. cheers
Steve

1

Plus facile à comprendre, c'est comme ça:

String s = "a,b,c,d,e";
String[] sArr = s.split(",");
List<String> sList = Arrays.asList(sArr);

1

Ceci utilise Gson à Kotlin

 val listString = "[uno,dos,tres,cuatro,cinco]"
 val gson = Gson()
 val lista = gson.fromJson(listString , Array<String>::class.java).toList()
 Log.e("GSON", lista[0])

0

Prenons une question: inverser une chaîne. Je vais le faire en utilisant stream (). Collect (). Mais d'abord, je changerai la chaîne en ArrayList.

    public class StringReverse1 {
    public static void main(String[] args) {

        String a = "Gini Gina  Proti";

        List<String> list = new ArrayList<String>(Arrays.asList(a.split("")));

        list.stream()
        .collect(Collectors.toCollection( LinkedList :: new ))
        .descendingIterator()
        .forEachRemaining(System.out::println);



    }}
/*
The output :
i
t
o
r
P


a
n
i
G

i
n
i
G
*/

1
alors ... vous utilisez la solution acceptée pour faire un exemple d'un problème différent? Pourquoi?
Francesco B.

0

Je recommande d'utiliser le StringTokenizer, c'est très efficace

     List<String> list = new ArrayList<>();

     StringTokenizer token = new StringTokenizer(value, LIST_SEPARATOR);
     while (token.hasMoreTokens()) {
           list.add(token.nextToken());
     }

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.