Как преобразовать строку в 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>()может быть избыточным в зависимости от того, как он используется. (как в вашем примере;)
Питер Лоури 08

1
Хе-хе, да, +1 :-) Это может даже быть splitего после: P
aioobe 08

Ему бы пришлось использовать его Arrays.toString()для печати, но да.
Питер Лоури 08

Новый 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("^\\[|]$", "");
Дэвид Ehrmann

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 в List <Character>
sofs1

это потому, что метод asList в классе Arrays принимает только массив объектов, а не примитивные массивы. Если вы конвертируете char [] в массив Character [], он будет работать.
Энди

общедоступный статический символ [] boxToCharacter (char [] charArray) {Character [] newArray = новый символ [charArray.length]; int я = 0; для (значение символа: charArray) {newArray [i ++] = Character.valueOf (значение); } return newArray; }
Энди

8

В Java 9 использование List#of, которое представляет собой статические фабричные методы неизменяемого списка, стало более простым.

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

s.split("\\s*,\\s*")могут быть добавлены для дополнительного ухода
Вишваджит Р. Шинде

2

Если вы импортируете или у вас есть массив (строки типа) в вашем коде, и вам нужно преобразовать его в arraylist (внешняя строка), то лучше использовать коллекции. как это:

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 в первую очередь. Очень часто вы собираетесь фильтровать список на основе дополнительных критериев, для которых Stream идеально подходит. Вам может понадобиться набор; вы можете отфильтровать их с помощью другого регулярного выражения и т. д. 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 = new 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);


0

Возьмем вопрос: перевернуть строку. Я сделаю это с помощью stream (). Collect (). Но сначала я изменю строку на 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
итак ... вы используете принятое решение, чтобы привести пример другой проблемы? Зачем?
Francesco B.

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.