Jak przekonwertować String na ArrayList?

101

W moim ciągu mogę mieć dowolną liczbę słów oddzielonych przecinkami. Chciałem, aby każde słowo zostało dodane do ArrayList. Na przykład:

String s = "a,b,c,d,e,.........";
Sameek Mishra
źródło

Odpowiedzi:

251

Spróbuj czegoś takiego

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

Próbny:

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]

Ten post został przepisany jako artykuł tutaj .

aioobe
źródło
9
+1: new ArrayList<String>()Może być zbędny w zależności od tego, jak jest używany. (jak to jest na twoim przykładzie;)
Peter Lawrey
1
Hehe, yeah, +1 :-) To może być nawet splitjego po: P
aioobe
Musiałby Arrays.toString()go wydrukować, ale tak.
Peter Lawrey
Nowa ArrayList <String> () powoduje utworzenie nowej listy zawierającej zwróconą listę. Arrays.asList (a) zwraca obiekt List, więc nie wywołuj nowej ArrayList, uzyskasz niepożądane zachowanie.
Clocker
6
Zauważ, że nie możesz dodawać elementów do listy zwróconej przez Arrays.asList. OP chciał mieć ArrayList (co jest całkowicie rozsądne) i konstrukcja ArrayList jest konieczna.
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
źródło
8
Jeśli musisz przyciąć nawiasy, możesz to zrobić za jednym razemreplace = s1.replaceAll("^\\[|]$", "");
David Ehrmann
9

Opcja 1 :

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

Opcja 2 :

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

Moim zdaniem opcja 1 jest lepsza, ponieważ

  1. możemy zmniejszyć liczbę tworzonych obiektów ArrayList z 2 do 1. asList Metoda tworzy i zwraca obiekt ArrayList.
  2. jego wydajność jest znacznie lepsza (ale zwraca listę o stałym rozmiarze).

Zapoznaj się z dokumentacją tutaj

Andy
źródło
Dlaczego to nie działa List<Character> word1 = new ArrayList<Character>(Arrays.asList(A[0].toCharArray()));Próbuję pobrać pierwszy ciąg z tablicy ciągów i przekonwertować ten ciąg na charArray, a ten charArray na List <Character>
sofs1
dzieje się tak dlatego, że metoda asList w klasie Arrays przyjmuje tylko tablice Object, a nie tablice pierwotne. Jeśli przekonwertujesz char [] na tablicę znaków [], zadziała.
Andy
public static Character [] boxToCharacter (char [] charArray) {Character [] newArray = new Character [charArray.length]; int i = 0; for (wartość char: charArray) {newArray [i ++] = Character.valueOf (wartość); } return newArray; }
Andy
8

W Javie 9 używanie List#of, które jest Immutable List Static Factory Methods, stało się prostsze.

 String s = "a,b,c,d,e,.........";
 List<String> lst = List.of(s.split(","));
Ravi
źródło
s.split("\\s*,\\s*")można dodać za dodatkową opiekę
Vishwajit R. Shinde
2

Jeśli importujesz lub masz tablicę (typu string) w swoim kodzie i musisz przekonwertować ją na arraylist (ciąg poza kursem), to lepiej jest używać kolekcji. lubię to:

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

List allEds = new ArrayList(); Collections.addAll(allEds, array1);
Andy
źródło
2

Ok, zamierzam rozszerzyć tutaj odpowiedzi, ponieważ wielu ludzi, którzy tu przychodzą, chce podzielić ciąg za pomocą białych znaków . Oto jak to się robi:

List<String> List = new ArrayList<String>(Arrays.asList(s.split("\\s+")));
Gherbi Hicham
źródło
2

Możesz użyć:

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

Powinieneś zadać sobie pytanie, czy naprawdę potrzebujesz przede wszystkim ArrayList. Bardzo często będziesz filtrować listę na podstawie dodatkowych kryteriów, dla których strumień jest idealny. Możesz chcieć zestaw; możesz chcieć je przefiltrować za pomocą innego wyrażenia regularnego, itp. Java 8 zapewnia przy okazji to bardzo przydatne rozszerzenie, które będzie działać na każdym CharSequence: https://docs.oracle.com/javase/8/docs/api /java/util/regex/Pattern.html#splitAsStream-java.lang.CharSequence- . Ponieważ w ogóle nie potrzebujesz tablicy, unikaj jej tworzenia w ten sposób:

// 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
źródło
1

Jeśli chcesz przekonwertować ciąg na ArrayList, spróbuj tego:

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

Ale widzę tablicę ciągów w twoim przykładzie, więc jeśli chcesz przekonwertować tablicę ciągów na ArrayList, użyj tego:

public static ArrayList<String> convertStringArrayToArraylist(String[] strArr){
    ArrayList<String> stringList = new ArrayList<String>();
    for (String s : strArr) {
        stringList.add(s);
    }
    return stringList;
}
denolk
źródło
Prostszym podejściem opartym na znakach byłoby: ArrayList <String> myList = new ArrayList <String> (); for (Character c: s.toCharArray ()) {myList.add (c.toString ()); } Ale nie sądzę, żeby ta osoba tego szukała. Potrzebne jest rozwiązanie firmy aioobe. okrzyki
Steve
1

Łatwiejsze do zrozumienia jest takie:

String s = "a,b,c,d,e";
String[] sArr = s.split(",");
List<String> sList = Arrays.asList(sArr);
Zatoka
źródło
1

To używa Gson w Kotlinie

 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
źródło
0

Zadajmy sobie pytanie: odwróć ciąg. Zrobię to za pomocą stream (). Collect (). Ale najpierw zmienię ciąg na 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
źródło
1
więc ... używasz zaakceptowanego rozwiązania, aby zrobić przykład dotyczący innego problemu? czemu?
Francesco B.
0

Polecam używać StringTokenizera, jest bardzo wydajny

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

     StringTokenizer token = new StringTokenizer(value, LIST_SEPARATOR);
     while (token.hasMoreTokens()) {
           list.add(token.nextToken());
     }
Philippe
źródło