Como converter uma String em uma ArrayList?

101

Na minha String, posso ter um número arbitrário de palavras separadas por vírgulas. Eu queria que cada palavra fosse adicionada a uma ArrayList. Por exemplo:

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

Respostas:

251

Tente algo como

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

Demo:

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]

Esta postagem foi reescrita como um artigo aqui .

aioobe
fonte
9
+1: O new ArrayList<String>()pode ser redundante dependendo de como é usado. (como no seu exemplo;)
Peter Lawrey,
1
Hehe, sim, +1 :-) Pode até ser apenas o splitdepois dele: P
aioobe
Ele teria que usar Arrays.toString()para imprimi-lo, mas sim.
Peter Lawrey,
O novo ArrayList <String> () faz com que uma nova lista seja criada com a lista retornada dentro dela. Arrays.asList (a) retorna um objeto List, portanto, não chame o novo ArrayList, você obterá um comportamento indesejado.
Clocker
6
Observe que você não pode adicionar elementos à lista retornada por Arrays.asList. O OP queria ter uma ArrayList (o que é completamente razoável) e a construção da ArrayList é necessária.
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());
Sameek Mishra
fonte
8
Se você precisar cortar os colchetes, poderá fazê-lo em uma etapa comreplace = s1.replaceAll("^\\[|]$", "");
David Ehrmann
9

Opção 1 :

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

Opção 2 :

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

Na minha opinião, a Opção 1 é melhor porque

  1. podemos reduzir o número de objetos ArrayList sendo criados de 2 para 1. O asListmétodo cria e retorna um objeto ArrayList.
  2. seu desempenho é muito melhor (mas retorna uma lista de tamanho fixo).

Consulte a documentação aqui

Andy
fonte
Por que isso não funciona? List<Character> word1 = new ArrayList<Character>(Arrays.asList(A[0].toCharArray()));Estou tentando obter a primeira String de uma matriz de string e converter essa string em charArray e esse charArray em List <Character>
sofs1
isso porque, o método asList na classe Arrays leva apenas array Object, não arrays primitivos. Se você converter char [] para o array Character [], funcionará.
Andy
public static Character [] boxToCharacter (char [] charArray) {Character [] newArray = new Character [charArray.length]; int i = 0; for (valor char: charArray) {newArray [i ++] = Character.valueOf (value); } return newArray; }
Andy
8

No Java 9, usar List#of, que é uma Lista Imutável de Métodos de Fábrica estáticos, tornou-se mais simples.

 String s = "a,b,c,d,e,.........";
 List<String> lst = List.of(s.split(","));
Ravi
fonte
s.split("\\s*,\\s*")pode ser adicionado para cuidado extra
Vishwajit R. Shinde
2

Se você está importando ou tem um array (do tipo string) em seu código e tem que convertê-lo em arraylist (string offcourse), então o uso de coleções é melhor. como isso:

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

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

Ok, vou estender as respostas aqui, já que muitas pessoas que vêm aqui querem dividir a string por um espaço em branco . Assim que se faz:

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

Você pode usar:

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

Você deve se perguntar se você realmente precisa do ArrayList em primeiro lugar. Muitas vezes, você filtrará a lista com base em critérios adicionais, para os quais um Stream é perfeito. Você pode querer um conjunto; você pode querer filtrá-los por meio de outra expressão regular, etc. Java 8 fornece esta extensão muito útil, a propósito, que funcionará em qualquer CharSequence: https://docs.oracle.com/javase/8/docs/api /java/util/regex/Pattern.html#splitAsStream-java.lang.CharSequence- . Como você não precisa da matriz, evite criá-la assim:

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

Se você deseja converter uma string em uma ArrayList, tente o seguinte:

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;
}

Mas eu vejo uma matriz de string em seu exemplo, então se você quiser converter uma matriz de string em ArrayList, use isto:

public static ArrayList<String> convertStringArrayToArraylist(String[] strArr){
    ArrayList<String> stringList = new ArrayList<String>();
    for (String s : strArr) {
        stringList.add(s);
    }
    return stringList;
}
denolk
fonte
Uma abordagem mais simples baseada em caracteres seria: ArrayList <String> myList = new ArrayList <String> (); for (Character c: s.toCharArray ()) {myList.add (c.toString ()); } Mas não acho que seja isso que a pessoa está procurando. A solução da aioobe é o que é necessário. saudações
Steve,
1

Mais fácil de entender é assim:

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

Isso é usar Gson em 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])
Felix A Marrero Pentón
fonte
0

Vamos fazer uma pergunta: Reverter uma String. Vou fazer isso usando stream (). Collect (). Mas primeiro devo mudar a string em uma 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
*/
Soudipta Dutta
fonte
1
então ... você está usando a solução aceita para dar um exemplo sobre um problema diferente? porque?
Francesco B.
0

Recomendo usar o StringTokenizer, é muito eficiente

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

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

Se você estiver usando goiaba (e deveria estar, consulte o item 15 de java eficaz ):

ImmutableList<String> list = ImmutableList.copyOf(s.split(","));
Sabujp
fonte