Як перетворити рядок у ArrayList?


101

У моєму рядку я можу мати довільну кількість слів, які розділені комами. Я хотів, щоб кожне слово було додане до ArrayList. Наприклад:

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

Відповіді:


251

Спробуйте щось на кшталт

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

Демонстрація:

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]

Ця публікація була переписана як стаття тут .


9
+1: new ArrayList<String>()може бути зайвим, залежно від способу його використання. (як це у вашому прикладі;)
Пітер Лорі

1
Hehe, так, +1 :-) Насправді це може бути навіть просто splitйого після: P
aioobe

Йому доведеться використовувати його Arrays.toString()для друку, але так.
Пітер Лорі

Новий ArrayList <String> () викликає створення нового списку із поверненим списком всередині нього. Arrays.asList (a) повертає об'єкт List, таким чином, не викликайте новий ArrayList, ви отримаєте небажану поведінку.
Clocker

6
Зауважте, що ви не можете додати елементи до списку, поверненого Arrays.asList. OP хотів мати ArrayList (що цілком розумно) і будівництво ArrayList є необхідним.
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
Якщо вам доведеться обрізати дужки, ви можете зробити це за один крокreplace = s1.replaceAll("^\\[|]$", "");
Девід Ерманн

9

Варіант1 :

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

Варіант2 :

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

На мій погляд, варіант 1 кращий, тому що

  1. ми можемо зменшити кількість створених об’єктів ArrayList з 2 до 1. asListМетод створює та повертає об’єкт ArrayList.
  2. його продуктивність значно краща (але вона повертає фіксований розмір).

Будь ласка, зверніться до документації тут


Чому це не працює, List<Character> word1 = new ArrayList<Character>(Arrays.asList(A[0].toCharArray()));я намагаюся отримати перший рядок рядкового масиву та перетворити цю рядок у charArray, а цей charArray в Список <Character>
sofs1

це тому, що метод asList у класі Arrays бере лише масив Object, а не примітивні масиви. Якщо ви перетворите char [] в масив символів [], він буде працювати.
Енді

загальнодоступний статичний символ [] boxToCharacter (char [] charArray) {Character [] newArray = новий символ [charArray.length]; int i = 0; для (char значення: charArray) {newArray [i ++] = Character.valueOf (значення); } повернути newArray; }
Енді

8

У Java 9 використання List#of, яке є незмінним списком статичних заводських методів, стає більш простим.

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

s.split("\\s*,\\s*")можна додати для додаткового догляду
Vishwajit R. Shinde

2

Якщо ви імпортуєте або у своєму коді є масив (рядок типу), і вам доведеться перетворити його в масив (рядок внеску), тоді використання колекцій краще. подобається це:

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

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

2

Гаразд, я збираюся поширити відповіді тут, оскільки багато людей, які приходять сюди, хочуть розділити рядок на пробіл . Ось як це робиться:

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

2

Ви можете використовувати:

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

Ви повинні запитати себе, чи дійсно вам потрібен ArrayList в першу чергу. Дуже часто ви збираєтеся фільтрувати список на основі додаткових критеріїв, для яких Потік ідеально підходить. Ви можете захотіти набір; ви можете відфільтрувати їх за допомогою іншого регулярного виразу тощо. Java 8, до речі, надає це дуже корисне розширення, яке буде працювати на будь-якому CharSequence: https://docs.oracle.com/javase/8/docs/api /java/util/regex/Pattern.html#splitAsStream-java.lang.CharSequence- . Оскільки масив вам взагалі не потрібен, уникайте його створювати таким чином:

// 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

Якщо ви хочете перетворити рядок у ArrayList, спробуйте це:

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

Але я бачу рядковий масив у вашому прикладі, тому якщо ви хочете перетворити рядковий масив у ArrayList, використовуйте це:

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

Більш простим підходом до символів буде: ArrayList <String> myList = новий ArrayList <String> (); for (Символ c: s.toCharArray ()) {myList.add (c.toString ()); } Але я не думаю, що саме це шукає людина. Рішення Aioobe - це те, що потрібно. ура
Стів

1

Простіше зрозуміти так:

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

1

Для цього використовується Гсон у Котліні

 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

Візьмемо питання: Зворотний рядок. Я зроблю це за допомогою stream (). Collection (). Але спочатку я зміню рядок на 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
так що ... ви використовуєте прийняте рішення, щоб зробити приклад про іншу проблему? чому?
Франческо Б.

0

Я рекомендую використовувати StringTokenizer, це дуже ефективно

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.