コンマ区切りの文字列をArrayListに変換する方法は?


538

カンマで区切られた文字列をコンテナ(配列、リスト、ベクターなど)に変換できるJavaの組み込みメソッドはありますか?または、そのためのカスタムコードを記述する必要がありますか?

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

CSVを解析する場合は、stackoverflow.com
questions / 3908012 / parsing

@RaedwaldそれはOPが要求したものではありません
Crowie

3
質問のタイトルのようにArrayListが必要であると仮定すると、ColinDの回答のみがここで正しいです。ArrayList(これは変更可能です)は、単純な固定リストであるListとは完全に異なります。
Fattie

@Fattie -フェアポイント、固定その- stackoverflow.com/a/34735419/744133
ヨーヨー

1
Java 8ソリューション:stackoverflow.com/a/46485179/1216775
akhil_mittal 2018

回答:


1016

コンマ区切りの文字列をリストに変換

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

上記のコードは、次のように定義された区切り文字で文字列を分割します。zero or more whitespace, a literal comma, zero or more whitespaceこれにより、単語がリストに配置され、単語とカンマの間の空白が折りたたまれます。


これは単に配列のラッパーを返すことに注意してください。たとえば、結果のからはできません。実際には、さらに使用する必要があります。.remove()ListArrayListnew ArrayList<String>


39
@roschその正規表現(regex)。\sは任意の空白に*一致し、は0回以上一致を適用します。つまり\s*、「空白にゼロ回以上一致する」という意味です。これをコンマの前後で探します。したがって、スプリットのような文字列のために働くだろう"item1 , item2 , item3"、または"item1,item2 ,item3"、などでJava、あなたはあなたが得るので、文字列内のバックスラッシュをエスケープする必要があります\\s*
andrewrjones

9
を使用"[\\s,]+"して値の空白を削除することをお勧めします。たとえば、に" item1 , item2 , item3 , "なり["item1", "item2", "item3"]ます。
Andrii Nemchenko 2014年

5
"[\\s,]+"また、コンマで区切られたトークン内の内部スペースで分割されます。カンマが存在しない場合でも、コンマと任意の数の周囲の空白ではなく、両方の空白を区切り文字として扱います。"\\s*(,\\s*)+"カンマで区切られたトークンの周りの空白のみを削除し、空白のみまたは空の文字列も無視します。
theferrit32 2015

2
余談ですが、入力文字列が空の場合に空のリストを取得すると予想される場合、このメソッドはユースケースに適していません。空の文字列を含む1つの要素のリストが表示されます。
Madis Pukkonen

3
@AlexR OPを尊重していただければ幸いですが、そんなことはお控えください。誤って褒められたときに、期待に応えられなかったことを嫌がる人を知っています。ちょっとした考え。

199

Arrays.asListList配列に基づく固定サイズを返します。通常のミュータブルjava.util.ArrayListが必要な場合は、次のようにする必要があります。

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

または、Guavaを使用します。

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

a Splitterを使用すると、文字列を分割する方法がより柔軟になり、たとえば、結果の空の文字列をスキップして結果をトリミングすることができます。またString.split、正規表現で分割する必要がない場合よりも、奇妙な動作が少なくなります(これは1つのオプションにすぎません)。


6
私はあなたがそれを言及しているのを見ますが、Splitter.on( "、")。trimResults()。split(string)を優先したでしょう。そう+1
ジョンB

10
+1は、Arrays.asListが通常のリストを返さないことを示します。そのリストに要素を追加または削除しようとすると、UnsupportedOperationExceptionが発生します。
Alfredo Osorio 2011

9
Guavaはこれを(15.0)以降備えています:Splitter.on( "、")。splitToList(string)。小さなステップを節約します。
Kango_V 2016

次のような文字列がある場合、文字列iikeに空の値を追加する方法はありますか:1、3、4、5ここでは2が見つからない/空です。リスト2で変換する場合はスキップされます。しかし、これを空の値として追加したいと思います。
A.Aleem11 2018年

この実装と他のいくつかの同様の例の問題は、がArrays.asListネイティブ配列の周りにラッパーを提供しますが(要素のコピーを回避)、new ArrayList(...)ごとにそのような要素を正確に実行ことです。解析された要素を目的のターゲットコレクションに直接追加できるようにするアプローチを選ぶべきでしょう。
ヨーヨー、

70

2つのステップ:

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

1
items変数をインライン化すると、基本的に他の回答と同じになりますが、正規表現を使用しないため、実際には少し効率的です。反対に、コンマの周りのスペースはこのオプションを無効にします。
Amrinder Arora 2016

2
@AmrinderAroraへの引数splitはRegExとして解釈されます。
Madbreaks 2017年

23

CSVをArrayListに変換するもう1つの方法を次に示します。

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

あなたを印刷します

- >文字列
- >と
- >コンマ


21

ListOPが述べたようにa が最終目標である場合、すでに受け入れられている答えは依然として最短かつ最良です。ただし、Java 8ストリームを使用して代替手段を提供したい、。これにより、さらに処理するためのパイプラインの一部である場合に、より多くの利点が得られます。

.split関数(ネイティブ配列)の結果をストリームにラップしてから、リストに変換する。

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

結果がArrayListOPのタイトルに従って保存されることが重要な場合は、別のCollector方法を使用できます。

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

または、RegEx解析APIを使用します。

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

list変数をのList<String>代わりに入力したままにすることを検討することもできますArrayList<String>。の汎用インターフェースは、Listまだ十分に似ています。ArrayList実装にます。

これらのコード例自体は、(タイピングを除いて)多くを追加するようには見えませんが、さらに多くのことを計画している場合は、文字列をLongのリストに変換するこの回答のように、ストリーミングAPIは、オペレーションを次々とパイプライン化します。

完全性のためにね。


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

1
現在、最良の答えの1つです。リストはこの回答+1で変更できます。
セドリック

変更後に作品collect(toList())collect(Collectors.toList()
Sundararaj Govindasamy

実際、簡潔さと流暢さcollect(toList())Collectors.toList()ために静的インポートを使用しています :)
Manu

15

このための組み込みメソッドはありませんが、split()メソッドを使用するだけで済みます。

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


10

asListとsplitを組み合わせることができます

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

8

このコードは役立ちます、

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

5

Guavaを使用して文字列を分割し、それをArrayListに変換できます。これは空の文字列でも機能し、空のリストを返します。

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

次を出力します。

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

4

を使用した例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を避けました。残念ながら、配列要素からコレクションへのコピーはまだ残っています。覚えておくと良い代替手段です。
ヨーヨー、

4

Java 8でストリームを使用してこれを解決するには多くの方法がありますが、IMOの次の1つのライナーは簡単です。

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());

この文字列をカンマ区切りのリストに変換する方法を誰かが知っていますか--String s = "2017-07-12 23:40:00.0,153.76,16.140,60.00、、56.00、"; List <String> splittedString = new ArrayList <String>(Arrays.asList(s.split( "\\ s *、\\ s *")));
サニー

1
これは新しい質問です。コメントとして質問しないでください。新しい質問を自由に作成してください。
ジョージSiggouroglou

2

最初にを使用してそれらを分割しString.split(",")、次に返された文字列arrayArrayList使用してArrays.asList(array)


2

groovyでは、tokenize(Character Token)メソッドを使用できます。

list = str.tokenize(',')

これは私を救った!ありがとうございました。
tamerlaha

2

Splitterクラスを使用して達成できる同じ結果。

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

(kotlinで記述)


1
ドキュメントには、この関数はベータ版で不安定であると書かれています。
Rubberducker、2018年


1

私は通常、リストにプリコンパイル済みパターンを使用します。また、listToString式の後に続くブラケットを考慮することができるため、これは少し普遍的です。

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では、このような文字列リストで、文字列をArrayListに変換するために使用できる場合は、次のコード行を使用します

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


0

次のようにして行うことができます。

これにより、空白が削除され、空白を気にする必要がない場所でコンマで分割されます。

    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

文字列->コレクション変換:(文字列->文字列[]->コレクション)

//         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()));

コレクション-> String []変換:

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

文字列->文字列[]変換:

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

そしてコレクション->コレクション

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

-2

Java 8でコレクションをカンマ区切りの文字列に変換します

listOfStringオブジェクトには、["A"、 "B"、 "C"、 "D"]要素が含まれます-

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

出力は:- 'A'、 'B'、 'C​​'、 'D'です。

そして、Java 8で文字列配列をリストに変換します

    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
そして、正確にはどこArrayListですか?あなたも質問を読みましたか?
Debosmit Ray 2016

@mapeters:がありましたArrayList。編集内容を最初のリビジョンにロールバックし(確認できるように)、最初のリビジョンのフォーマットを改善しました。
DUR

問題は、文字列をArrayListに変換する方法であり、ArrayListを配列に変換する方法ではありません。
同志
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.