¿Cómo convertir una cadena en una ArrayList?


101

En mi Cadena, puedo tener un número arbitrario de palabras separadas por comas. Quería agregar cada palabra a una ArrayList. P.ej:

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

Respuestas:


251

Prueba algo como

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

Manifestación:

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 publicación ha sido reescrita como un artículo aquí .


9
+1: new ArrayList<String>()puede ser redundante dependiendo de cómo se utilice. (como en su ejemplo;)
Peter Lawrey

1
Jeje, sí, +1 :-) En realidad, incluso puede ser splitsu después: P
aioobe

Tendría que usarlo Arrays.toString()para imprimirlo, pero sí.
Peter Lawrey

El nuevo ArrayList <String> () hace que se cree una nueva lista con la lista devuelta dentro de ella. Arrays.asList (a) devuelve un objeto List, por lo tanto, no llame a una nueva ArrayList, obtendrá un comportamiento no deseado.
Clocker

6
Tenga en cuenta que no puede agregar elementos a la lista devuelta por Arrays.asList. El OP quería tener una ArrayList (que es completamente razonable) y la construcción ArrayList es necesaria.
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 tiene que recortar los soportes, puede hacerlo en un solo paso conreplace = s1.replaceAll("^\\[|]$", "");
David Ehrmann

9

Option1 :

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

Option2 :

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

En mi opinión, Option1 es mejor porque

  1. podemos reducir el número de objetos ArrayList que se crean de 2 a 1. El asListmétodo crea y devuelve un objeto ArrayList.
  2. su rendimiento es mucho mejor (pero devuelve una lista de tamaño fijo).

Consulte la documentación aquí.


¿Por qué no funciona esto List<Character> word1 = new ArrayList<Character>(Arrays.asList(A[0].toCharArray()));? Estoy tratando de obtener la primera cadena de una matriz de cadenas y convertir esa cadena en charArray y ese charArray en List <Character>
sofs1

eso es porque, el método asList en la clase Arrays toma solo una matriz de objetos, no matrices primitivas. Si convierte char [] a Character [] array, funcionará.
Andy

Public static Character [] boxToCharacter (char [] charArray) {Character [] newArray = new Character [charArray.length]; int i = 0; for (valor de carácter: charArray) {newArray [i ++] = Character.valueOf (valor); } return newArray; }
Andy

8

En Java 9, el uso List#of, que es una lista inmutable de métodos de fábrica estáticos, se vuelve más simple.

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

s.split("\\s*,\\s*")se puede agregar para un cuidado adicional
Vishwajit R. Shinde

2

Si está importando o tiene una matriz (de tipo cadena) en su código y tiene que convertirla en lista de matrices (cadena fuera de curso), entonces el uso de colecciones es mejor. Me gusta esto:

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

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

2

Ok, voy a extenderme sobre las respuestas aquí, ya que muchas de las personas que vienen aquí quieren dividir la cadena por un espacio en blanco . Así es como se hace:

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

2

Podrías usar:

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

Debería preguntarse si realmente necesita ArrayList en primer lugar. Muy a menudo, filtrará la lista en función de criterios adicionales, para los cuales un Stream es perfecto. Es posible que desee un juego; es posible que desee filtrarlos por medio de otra expresión regular, etc. Java 8 proporciona esta extensión muy útil, por cierto, que funcionará en cualquier CharSequence: https://docs.oracle.com/javase/8/docs/api /java/util/regex/Pattern.html#splitAsStream-java.lang.CharSequence- . Como no necesita la matriz en absoluto, evite crearla así:

// 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 desea convertir una cadena en una ArrayList, intente esto:

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

Pero veo una matriz de cadenas en su ejemplo, por lo que si desea convertir una matriz de cadenas en ArrayList, use esto:

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

Un enfoque basado en caracteres más simple sería: ArrayList <String> myList = new ArrayList <String> (); para (Carácter c: s.toCharArray ()) {myList.add (c.toString ()); } Pero no creo que esto sea lo que la persona está buscando. La solución de aioobe es lo que se requiere. aclamaciones
Steve

1

Más fácil de entender es así:

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

1

Esto está usando Gson en 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

Tomemos una pregunta: invertir una cadena. Haré esto usando stream (). Collect (). Pero primero cambiaré la cadena a una 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
entonces ... ¿está utilizando la solución aceptada para hacer un ejemplo sobre un problema diferente? ¿por qué?
Francesco B.

0

Recomiendo usar StringTokenizer, es muy eficiente

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.