Virgülle ayrılmış String'i ArrayList'e nasıl dönüştürebilirim?


538

Java'da virgülle ayrılmış String'i bir kaba (örn. Dizi, Liste veya Vektör) dönüştürmemize izin veren yerleşik bir yöntem var mı? Yoksa bunun için özel kod yazmam gerekir mi?

String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = //method that converts above string into list??

CSV'yi ayrıştırmak istiyorsanız bkz. Stackoverflow.com/questions/3908012/parsing-csv-in-java
Raedwald

@Raedwald OP'nin istediği şey bu değil
Crowie

3
Soru başlığında olduğu gibi bir ArrayList istediğinizi varsayarsak, SADECE ColinD'nin yanıtı doğrudur. ArrayList (değiştirilebilir), basit bir sabit liste olabilen List'ten tamamen farklıdır.
Fattie

@Fattie - adil puan ve bunu düzeltti - stackoverflow.com/a/34735419/744133
YoYo

Yanıtlar:


1016

Virgülle ayrılmış Dizeyi Listeye Dönüştür

List<String> items = Arrays.asList(str.split("\\s*,\\s*"));

Yukarıdaki kod, dizeyi şu şekilde tanımlanmış bir ayırıcıya böler: zero or more whitespace, a literal comma, zero or more whitespaceBu, sözcükleri listeye yerleştirir ve sözcükler ile virgüller arasındaki boşlukları daraltır.


Unutmayın ki sadece bu döner bir dizide bir sarıcı: Eğer CAN NOT örneğin .remove()sonuçlanan dan List. Bir gerçek ArrayListiçin daha fazla kullanmalısınız new ArrayList<String>.


39
@rosch Düzenli bir ifade (normal ifade). \sherhangi bir beyaz boşlukla eşleşir *, Eşleşmeyi sıfır veya daha fazla kez uygular. Yani \s*"boşluğu sıfır veya daha fazla kez eşleştir" anlamına gelir. Bunu virgülden önce ve sonra ararız. Bu nedenle, bölünme "item1 , item2 , item3", veya gibi dizeler için çalışacaktır "item1,item2 ,item3". Java'da, dizelerde ters eğik \\s*
çizgiden kaçmanız

9
"[\\s,]+"Değerler için beyaz boşlukları düzeltmek için kullanmanızı öneririm . Örneğin, " item1 , item2 , item3 , "olur ["item1", "item2", "item3"].
Andrii Nemchenko

5
"[\\s,]+"ayrıca virgülle ayrılmış bir belirteç içindeki iç alana bölünürse, virgül olmadığında bile virgül artı herhangi bir sayıda çevreleyen boşluk yerine her iki boşluğu da sınırlayıcı olarak ele alır. "\\s*(,\\s*)+"boşlukları yalnızca virgülle ayrılmış belirteçlerin çevresinde kırpır ve yalnızca boşluk veya boş olan tüm dizeleri yoksayar.
theferrit32

2
Bir yan not olarak: boş bir giriş dizesi durumunda boş bir liste almayı bekliyorsanız, bu yöntem kullanım durumunuza uymaz. Boş bir dize içeren 1 elemanlı bir liste alırsınız.
Madis Pukkonen

3
@AlexR OP'ye saygı duyduğunuzu takdir etsem de, böyle şeyler söylemekten kaçınırım. Yanlış övgüyle insanların beklentilerini karşılamadığı için kendini kötü hisseden insanları biliyorum. Sadece bir düşünce.

199

Arrays.asListListdizi tarafından desteklenen sabit boyutlu bir döndürür . Normal bir mutable java.util.ArrayLististiyorsanız, bunu yapmanız gerekir:

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

Veya, Guava kullanarak :

List<String> list = Lists.newArrayList(Splitter.on(" , ").split(string));

A kullanmak Splitter, dizeyi bölme konusunda size daha fazla esneklik sağlar ve örneğin sonuçlarda boş dizeleri atlama ve sonuçları kırpma olanağı sunar. Ayrıca String.splitregex ile bölünmenizi gerektirmediğinden daha az garip bir davranışa sahiptir (bu sadece bir seçenektir).


6
Splitter.on (","). TrimResults (). Split (string) 'i tercih etmişsinizdir . yani +1
John B

10
+1, Arrays.asList öğesinin normal bir liste döndürmediğini göstermek için kullanılır. Bu listeye / listesinden bir öğe eklemeye veya listeden bir öğe kaldırmaya çalışırsanız, bir UnsupportedOperationException elde edersiniz.
Alfredo Osorio

9
Guava şimdi (15.0) 'dan beri var: Splitter.on (","). SplitToList (string) . Küçük bir adım kaydeder.
Kango_V

Eğer böyle String varsa ben String iike de boş değerler eklemek için herhangi bir yolu var mı: 1, 3,4,5 burada 2 eksik / boş. Liste 2'ye dönüştürürken atlar. Ama bunu boş değer olarak eklemek istiyorum.
A.Aleem11

Bu uygulama ve diğer bazı benzer örneklerle Arrays.asListilgili sorun, yerel dizi (bir öğe kopyasını kaçınarak) etrafında bir sarıcı sağlamakla birlikte new ArrayList(...), tam olarak böyle bir öğeyi öğe kopyasını yapacak olmasıdır. Ayrıştırılmış öğelerin doğrudan istenen hedef koleksiyonuna eklenmesini sağlayan bir yaklaşımı tercih etmeliyiz.
YoYo

70

İki adım:

  1. String [] items = commaSeparated.split("\\s*,\\s*");
  2. List<String> container = Arrays.asList(items);

1
Öğeler değişkenini satır içine aldıktan sonra, temel olarak diğer cevaplarla aynıdır, ancak normal ifadeyi kullanmadığı için aslında biraz daha verimlidir. Kapak tarafında, virgül etrafındaki boşluklar bu seçeneği öldürür.
Amrinder Arora

2
@AmrinderArora argümanı splitRegEx olarak yorumlanır.
Madbreaks

23

CSV'yi ArrayList'e dönüştürmek için bir tane daha:

String str="string,with,comma";
ArrayList aList= new ArrayList(Arrays.asList(str.split(",")));
for(int i=0;i<aList.size();i++)
{
    System.out.println(" -->"+aList.get(i));
}

Sizi yazdırır

-> string
-> with
-> virgül


21

A List, OP'nin belirttiği gibi nihai hedef ise, o zaman zaten kabul edilen cevap hala en kısa ve en iyisidir. Ancak Java 8 Akışlarını kullanarak alternatifler sunmak istiyorum , , bu da daha fazla işlem için bir boru hattının parçasıysa size daha fazla fayda sağlayacaktır.

.Split işlevinin (yerel bir dizi) sonucunu bir akışa sararak ve daha sonra bir listeye dönüştürerek.

List<String> list =
  Stream.of("a,b,c".split(","))
  .collect(Collectors.toList());

Sonucun ArrayListOP'nin başlığına göre depolanması önemliyse, farklı bir Collectoryöntem kullanabilirsiniz :

ArrayList<String> list = 
  Stream.of("a,b,c".split(","))
  .collect(Collectors.toCollection(ArrayList<String>::new));

Veya RegEx ayrıştırma API'sini kullanarak:

ArrayList<String> list = 
  Pattern.compile(",")
  .splitAsStream("a,b,c")
  .collect(Collectors.toCollection(ArrayList<String>::new));

listDeğişken List<String>yerine yazılan olarak bırakılmayı düşünebileceğinizi unutmayın ArrayList<String>. Genel arayüz Listhala ArrayListuygulamaya yeterince benzer görünüyor .

Kendi başlarına, bu kod örnekleri çok fazla gibi görünmüyor (daha fazla yazım hariç), ancak daha fazla şey yapmayı planlıyorsanız, bir String'i Longs Örnekleri Listesine dönüştürmek için bu cevap gibi , akış API'si izin vererek gerçekten güçlüdür. operasyonlarınızı birbiri ardına boru hattına bağlamak.

Tamlık uğruna.


19
List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(toList());

1
Şimdi en iyi cevaplardan biri. Bu cevap +1'de liste değiştirilebilir.
Sedrick

değiştirildikten sonra çalışır collect(toList())içincollect(Collectors.toList()
Sundararaj Govindasamy

Aslında collect(toList()), Collectors.toList()kısalık ve akıcılık için statik ithalatını kullanıyor :)
Manu

15

Bunun için yerleşik bir yöntem yoktur, ancak bunun için split () yöntemini kullanabilirsiniz.

String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = 
new  ArrayList<String>(Arrays.asList(commaSeparated.split(",")));

14
List<String> items = Arrays.asList(commaSeparated.split(","));

Bu senin için işe yaramalı.


10

asList ve split öğelerini birleştirebilirsiniz

Arrays.asList(CommaSeparated.split("\\s*,\\s*"))

8

Bu kod yardımcı olacaktır,

String myStr = "item1,item2,item3";
List myList = Arrays.asList(myStr.split(","));

5

Dizeyi bölmek ve bir ArrayList'e dönüştürmek için Guava'yı kullanabilirsiniz. Bu, boş bir dize ile de çalışır ve boş bir liste döndürür.

import com.google.common.base.Splitter;
import com.google.common.collect.Lists;

String commaSeparated = "item1 , item2 , item3";

// Split string into list, trimming each item and removing empty items
ArrayList<String> list = Lists.newArrayList(Splitter.on(',').trimResults().omitEmptyStrings().splitToList(commaSeparated));
System.out.println(list);

list.add("another item");
System.out.println(list);

aşağıdakileri çıktılar:

[item1, item2, item3]
[item1, item2, item3, another item]

4

Kullanarak bir örnek Collections.

import java.util.Collections;
 ...
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = new ArrayList<>();
Collections.addAll(items, commaSeparated.split("\\s*,\\s*"));
 ...

1
Arrays.asList aracısından kaçındınız. Ne yazık ki, dizi öğelerinden koleksiyona bir kopyamız hala var. Hatırlamak için güzel bir alternatif.
YoYo

4

Java 8'de akışları kullanarak bunu çözmenin birçok yolu vardır, ancak IMO aşağıdaki tek satırlar düzdür:

String  commaSeparated = "item1 , item2 , item3";
List<String> result1 = Arrays.stream(commaSeparated.split(" , "))
                                             .collect(Collectors.toList());
List<String> result2 = Stream.of(commaSeparated.split(" , "))
                                             .collect(Collectors.toList());

Herkes bu Dize virgülle ayrılmış listeye nasıl dönüştürebilirim biliyor mu? Liste <String> splittedString = yeni ArrayList <String> (Arrays.asList (s.split ("\\ s *, \\ s *")));
Güneşli

1
Bu yeni bir soru, yorum olarak sormayın. Yeni bir soru oluşturmaktan çekinmeyin.
George Siggouroglou

2

Önce kullanarak bunları ayırabilirsiniz String.split(",")ve sonra döndürülen dize dönüştürmek arraybir etmek ArrayListkullanılarakArrays.asList(array)


2

Harika bir şekilde, tokenize (Character Token) yöntemini kullanabilirsiniz:

list = str.tokenize(',')

Bu beni kurtardı! Teşekkür ederim.
tamerlaha

2

Splitter sınıfını kullanarak elde edebileceğiniz aynı sonuç.

var list = Splitter.on(",").splitToList(YourStringVariable)

(kotlin ile yazılmış)


1
Belgeler bu işlevin beta ve kararsız olduğunu söylüyor.
Rubberducker

1
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));

// enter code here

1

Liste için genellikle önceden derlenmiş desen kullanırım. ListToString ifadelerinin bazılarını takip eden parantezleri de dikkate alabileceğinden, bu biraz daha evrenseldir.

private static final Pattern listAsString = Pattern.compile("^\\[?([^\\[\\]]*)\\]?$");

private List<String> getList(String value) {
  Matcher matcher = listAsString.matcher((String) value);
  if (matcher.matches()) {
    String[] split = matcher.group(matcher.groupCount()).split("\\s*,\\s*");
    return new ArrayList<>(Arrays.asList(split));
  }
  return Collections.emptyList();

1

Kotlin içinde eğer Dize listeniz böyle ve ArrayList dönüştürmek için kullanabilirsiniz için bu kod satırı kullanın

var str= "item1, item2, item3, item4"
var itemsList = str.split(", ")


0

Bunu aşağıdaki gibi yapabilirsiniz.

Bu, beyaz boşlukları kaldırır ve beyaz boşluklar hakkında endişelenmenize gerek olmayan virgülle bölünür.

    String myString= "A, B, C, D";

    //Remove whitespace and split by comma 
    List<String> finalString= Arrays.asList(myString.split("\\s*,\\s*"));

    System.out.println(finalString);

-1

String -> Koleksiyon dönüşümü: (String -> String [] -> Koleksiyon)

//         java version 8

String str = "aa,bb,cc,dd,aa,ss,bb,ee,aa,zz,dd,ff,hh";

//          Collection,
//          Set , List,
//      HashSet , ArrayList ...
// (____________________________)
// ||                          ||
// \/                          \/
Collection<String> col = new HashSet<>(Stream.of(str.split(",")).collect(Collectors.toList()));

Koleksiyon -> String [] dönüşümü:

String[] se = col.toArray(new String[col.size()]);

String -> String [] dönüşümü:

String[] strArr = str.split(",");

Ve Koleksiyon -> Koleksiyon :

List<String> list = new LinkedList<>(col);

-2

Koleksiyonu virgülle ayrılmış olarak dizeye dönüştür Java 8'de

listOfString nesnesi ["A", "B", "C", "D"] öğelerini içerir.

listOfString.stream().map(ele->"'"+ele+"'").collect(Collectors.joining(","))

Çıktı: - 'A', 'B', 'C', 'D'

Ve Dizeler Dizisini Java 8'de Listeye Dönüştür

    String string[] ={"A","B","C","D"};
    List<String> listOfString = Stream.of(string).collect(Collectors.toList());

-4
ArrayList<HashMap<String, String>> mListmain = new ArrayList<HashMap<String, String>>(); 
String marray[]= mListmain.split(",");

5
Ve tam olarak nerede ArrayList? Soruyu bile okudun mu?
Rayosmit Ray

@mapeters: Bir vardı ArrayList. Düzenlemeleri ilk revizyona geri aldım (böylece görebilirsiniz) ve ilk revizyonun biçimlendirmesini geliştirdim.
dur

Soru, dizeyi ArrayList'e nasıl dönüştüreceğinizi değil, ArrayList'i Array'a dönüştürmeyi değil.
yoldaş
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.