カンマで区切られた文字列をコンテナ(配列、リスト、ベクターなど)に変換できるJavaの組み込みメソッドはありますか?または、そのためのカスタムコードを記述する必要がありますか?
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = //method that converts above string into list??
カンマで区切られた文字列をコンテナ(配列、リスト、ベクターなど)に変換できるJavaの組み込みメソッドはありますか?または、そのためのカスタムコードを記述する必要がありますか?
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = //method that converts above string into list??
回答:
コンマ区切りの文字列をリストに変換
List<String> items = Arrays.asList(str.split("\\s*,\\s*"));
上記のコードは、次のように定義された区切り文字で文字列を分割します。zero or more whitespace, a literal comma, zero or more whitespace
これにより、単語がリストに配置され、単語とカンマの間の空白が折りたたまれます。
これは単に配列のラッパーを返すことに注意してください。たとえば、結果のからはできません。実際には、さらに使用する必要があります。.remove()
List
ArrayList
new ArrayList<String>
\s
は任意の空白に*
一致し、は0回以上一致を適用します。つまり\s*
、「空白にゼロ回以上一致する」という意味です。これをコンマの前後で探します。したがって、スプリットのような文字列のために働くだろう"item1 , item2 , item3"
、または"item1,item2 ,item3"
、などでJava、あなたはあなたが得るので、文字列内のバックスラッシュをエスケープする必要があります\\s*
"[\\s,]+"
して値の空白を削除することをお勧めします。たとえば、に" item1 , item2 , item3 , "
なり["item1", "item2", "item3"]
ます。
"[\\s,]+"
また、コンマで区切られたトークン内の内部スペースで分割されます。カンマが存在しない場合でも、コンマと任意の数の周囲の空白ではなく、両方の空白を区切り文字として扱います。"\\s*(,\\s*)+"
カンマで区切られたトークンの周りの空白のみを削除し、空白のみまたは空の文字列も無視します。
Arrays.asList
List
配列に基づく固定サイズを返します。通常のミュータブル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つのオプションにすぎません)。
Arrays.asList
ネイティブ配列の周りにラッパーを提供しますが(要素のコピーを回避)、new ArrayList(...)
ごとにそのような要素を正確に実行ことです。解析された要素を目的のターゲットコレクションに直接追加できるようにするアプローチを選ぶべきでしょう。
2つのステップ:
String [] items = commaSeparated.split("\\s*,\\s*");
List<String> container = Arrays.asList(items);
split
はRegExとして解釈されます。
List
OPが述べたようにa が最終目標である場合、すでに受け入れられている答えは依然として最短かつ最良です。ただし、Java 8ストリームを使用して代替手段を提供したい、。これにより、さらに処理するためのパイプラインの一部である場合に、より多くの利点が得られます。
.split関数(ネイティブ配列)の結果をストリームにラップしてから、リストに変換する。
List<String> list =
Stream.of("a,b,c".split(","))
.collect(Collectors.toList());
結果がArrayList
OPのタイトルに従って保存されることが重要な場合は、別の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は、オペレーションを次々とパイプライン化します。
完全性のためにね。
List<String> items= Stream.of(commaSeparated.split(","))
.map(String::trim)
.collect(toList());
collect(toList())
にcollect(Collectors.toList()
collect(toList())
のCollectors.toList()
ために静的インポートを使用しています :)
List<String> items = Arrays.asList(commaSeparated.split(","));
それはあなたのために働くはずです。
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]
を使用した例Collections
。
import java.util.Collections;
...
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = new ArrayList<>();
Collections.addAll(items, commaSeparated.split("\\s*,\\s*"));
...
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());
groovyでは、tokenize(Character Token)メソッドを使用できます。
list = str.tokenize(',')
Splitterクラスを使用して達成できる同じ結果。
var list = Splitter.on(",").splitToList(YourStringVariable)
(kotlinで記述)
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));
// enter code here
私は通常、リストにプリコンパイル済みパターンを使用します。また、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();
Kotlinでは、このような文字列リストで、文字列をArrayListに変換するために使用できる場合は、次のコード行を使用します
var str= "item1, item2, item3, item4"
var itemsList = str.split(", ")
List<String> items = Arrays.asList(s.split("[,\\s]+"));
文字列->コレクション変換:(文字列->文字列[]->コレクション)
// 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);
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());
ArrayList<HashMap<String, String>> mListmain = new ArrayList<HashMap<String, String>>();
String marray[]= mListmain.split(",");
ArrayList
ですか?あなたも質問を読みましたか?
ArrayList
。編集内容を最初のリビジョンにロールバックし(確認できるように)、最初のリビジョンのフォーマットを改善しました。