カンマ区切りの文字列を分割する方法は?


202

長さが不明なこのような文字列があります

"dog, cat, bear, elephant, ..., giraffe"

この文字列をコンマで区切るための最適な方法は何ですか?各単語がArrayListの要素になることができますか?

例えば

List<String> strings = new ArrayList<Strings>();
// Add the data here so strings.get(0) would be equal to "dog",
// strings.get(1) would be equal to "cat" and so forth.

1
メソッドsplit( "spliting char")を使用すると、文字列が分割されます。メソッドと文字列は、単語が分割された文字列配列を作成します。
Simon Dorociak

回答:


343

あなたはこれを行うことができます:

String str = "...";
List<String> elephantList = Arrays.asList(str.split(","));

基本的に、.split()メソッドは渡した(この場合)区切り文字に従って文字列を分割し、文字列の配列を返します。

ただし、配列ではなく文字列のリストの後にあるように見えるため、Arrays.asList()ユーティリティを使用して配列をリストに変換する必要があります。参考までに、次のようなこともできます。

String str = "...";
ArrayList<String> elephantList = new ArrayList<>(Arrays.asList(str.split(","));

しかし、通常は実際の具体的な実装ではなく、インターフェイスにプログラムする方が良いので、最初のオプションをお勧めします。


9
これは値をトリムしないので、strings.get(1)は「cat」ではなく「cat」になることに注意してください
Alb

45
str.split正規表現を受け入れ、使用できるstr.split(",[ ]*");ようにして、コンマとコンマの後のスペースを削除します。
vertti 2013年

4
コンマ区切りファイル(csv)では、引用符内にコンマが含まれている場合があります。これは、区切り文字ではないことを意味します。この場合、分割は機能しません。
Steven Trigg 2014年

2
2番目のオプションはasへのキャストが必要ArrayList<String>です。
C_B 2014

3
あたりとして- (1、「」)あなたは(一貫性のある配列の長さeg.for)使用スプリット空のエントリを保持する必要がある場合stackoverflow.com/questions/14602062/...
高速Engy

157

さて、あなたは分割したいですよね?

String animals = "dog, cat, bear, elephant, giraffe";

String[] animalsArray = animals.split(",");

アイテムの周りの空白をさらに削除したい場合:

String[] animalsArray = animals.split("\\s*,\\s*");

はい、それはソリューションの一部です。OPは配列ではなく文字列のリストの後にあるようです。
npinti

@npinti:ええ、あなたに+1、あなたはより速く、私はあなたのArrays.asList()イディオムをコピーしたくありませんでした。
Tomasz Nurkiewicz

1
私は10時間考え続けた後、SOを検索しました。.split()がとても簡単であることを知りませんでした。
DeathRs

結果の分割アイテムを配列ではなくセットに保存したい場合はどうでしょうか?
Moses Kirathe 2018年

29

あなたはそれを分割して配列を作成し、配列のようにアクセスできます

String names = "prappo,prince";
String[] namesList = names.split(",");

次のようにアクセスできます

String name1 = namesList [0];
String name2 = namesList [1];

またはループを使用して

for(String name : namesList){
System.out.println(name);
}

それがあなたを助けることを願っています。


18

小さな改善:上記のソリューションでは、実際の文字列の先頭または末尾のスペースは削除されません。splitを呼び出す前にtrimを呼び出すことをお勧めします。これの代わりに、

 String[] animalsArray = animals.split("\\s*,\\s*");

使用する

 String[] animalsArray = animals.trim().split("\\s*,\\s*");

1
2行目では、trim()を使用する場合、スペースを分割する必要はありません。これを("\\s*,\\s*")使用するだけで(",");同じ結果になります。
ウィザード2015年

5
trimは文字列の左と右のスペースのみを削除し、文字列のスペースは削除しないため、その@WIZARDはわかりません。そうtrim(" string, with , space ")なります"string, with , space"
Thomas Leduc

@ThomasLeduc文字列がこのような場合"dog, cat, bear, elephant, giraffe"、不要でtrim()あり、使用する場合trim()、出力"string,with,space"はこれではあり ません"string, with , space"
ウィザード

trim()文字列の左右のスペースだけでなく、すべてのスペースを削除します
ウィザード

5
あなたはそれをテストしますか?私はプログラムjavaと文字列" string, with , space ".trim()returnを書いたばかりだから "string, with , space"です。javadocの言うように、文字列のコピーを返します。先頭と末尾の空白は省略されています。あなたは間違っており、@ user872858は正しいです。
Thomas Leduc

3

まず、このように名前を分割できます

String animals = "dog, cat, bear, elephant,giraffe";

String animals_list[] = animals.split(",");

動物にアクセスする

String animal1 = animals_list[0];
String animal2 = animals_list[1];
String animal3 = animals_list[2];
String animal4 = animals_list[3];

また、動物の名前の周りの空白とカンマを削除したい

String animals_list[] = animals.split("\\s*,\\s*");

3

完全性のために、グアバを使用してライブラリ、次のようにします。 Splitter.on(",").split(“dog,cat,fox”)

もう一つの例:

String animals = "dog,cat, bear,elephant , giraffe ,  zebra  ,walrus";
List<String> l = Lists.newArrayList(Splitter.on(",").trimResults().split(animals));
// -> [dog, cat, bear, elephant, giraffe, zebra, walrus]

Splitter.split()Iterableを返すため、リストが必要な場合はLists.newArrayList()、上記のようにラップします。それ以外の場合は、たとえばIterableを使用します。

for (String animal : Splitter.on(",").trimResults().split(animals)) {
    // ...
}

は、と同様に、コーナーケースの正規表現trimResults()微調整する必要なく、がすべてのトリミングニーズを処理することに注意してくださいString.split()

プロジェクトですでにGuavaを使用している場合、これが推奨されるソリューションです。詳細な構成オプションについては、Guavaユーザーガイドのスプリッタードキュメントまたはjavadocsを参照してください。


2

これでうまくいきました

 sg = sg.replaceAll(", $", "");

さもなければ

if (sg.endsWith(",")) {
                    sg = sg.substring(0, sg.length() - 1);
                }

1

build.gradleにGuavaを追加

    compile group: 'com.google.guava', name: 'guava', version: '27.0-jre'

その後

    public static List<String> splitByComma(String str) {
    Iterable<String> split = Splitter.on(",")
            .omitEmptyStrings()
            .trimResults()
            .split(str);
    return Lists.newArrayList(split);
    }

    public static String joinWithComma(Set<String> words) {
        return Joiner.on(", ").skipNulls().join(words);
    }

楽しい :)


0

すべての空白を削除し、固定サイズまたは不変のリストを作成します(asList APIドキュメントを参照)

final String str = "dog, cat, bear, elephant, ..., giraffe";
List<String> list = Arrays.asList(str.replaceAll("\\s", "").split(","));
// result: [dog, cat, bear, elephant, ..., giraffe]

使用することも可能ですreplaceAll(\\s+", "")が、最大効率はユースケースによって異なります。(Javaの文字列からの空白の削除に対する @GurselKocaの回答を参照)


0

次のようなものを使用できます。

String animals = "dog, cat, bear, elephant, giraffe";

List<String> animalList = Arrays.asList(animals.split(","));

また、libsを含めます。

import java.util.ArrayList;
import java.util.Arrays; 
import java.util.List;


0

コトリンでは

val stringArray = commasString.replace(", ", ",").split(",")

どこにstringArrayあるList<String>commasStringされString、カンマとスペースで


0

これは、カンマで文字列を分割する簡単な方法です。

import java.util.*;

public class SeparatedByComma{
public static void main(String []args){
     String listOfStates = "Hasalak, Mahiyanganaya, Dambarawa, Colombo";
     List<String> stateList = Arrays.asList(listOfStates.split("\\,"));
     System.out.println(stateList);
 }
}

このコードはJDKで使用しました。配列を印刷する必要がある場合。System.out.printlnを使用する
Sandun Susantha

-1

replaceAll()空白を必要なものに置き換えることですべての空白を削除できるという関数があります。例として

String str="  15. 9 4;16.0 1"
String firstAndSecond[]=str.replaceAll("\\s","").split(";");
System.out.println("First:"+firstAndSecond[0]+", Second:"+firstAndSecond[1]);

あなたに与えるでしょう:

First:15.94, Second:16.01
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.