web-dev-qa-db-ja.com

Javaの文の文字列を単語の文字列配列に変換する

私のJavaプログラムは次のような文字列を取る必要があります:

"This is a sample sentence."

次のような文字列配列に変換します。

{"this","is","a","sample","sentence"}

ピリオドまたは句読点なし(できれば)。ところで、文字列の入力は常に1つの文です。

私が見ていないこれを行う簡単な方法はありますか?それとも、本当にスペースを多く検索し、スペース間の領域(単語)から新しい文字列を作成する必要がありますか?

37
AnimatedRNG

String.split() は、必要なことのほとんどを実行します。その後、句読点を引き出すために単語をループする必要があります。

例えば:

String s = "This is a sample sentence.";
String[] words = s.split("\\s+");
for (int i = 0; i < words.length; i++) {
    // You may want to check for a non-Word character before blindly
    // performing a replacement
    // It may also be necessary to adjust the character class
    words[i] = words[i].replaceAll("[^\\w]", "");
}
54
Adam Batkin

これで、正規表現が必要になるため、splitでこれを実現できます。

String s = "This is a sample sentence with []s.";
String[] words = s.split("\\W+");

これは次のような言葉を与えます:{"this","is","a","sample","sentence", "s"}

\\W+は、1回以上出現するすべてのアルファベット以外の文字と一致します。そのため、交換する必要はありません。他のパターンも確認できます。

19
Ganapathi.D

BreakIterator.getWordInstanceを使用して、文字列内のすべての単語を検索できます。

public static List<String> getWords(String text) {
    List<String> words = new ArrayList<String>();
    BreakIterator breakIterator = BreakIterator.getWordInstance();
    breakIterator.setText(text);
    int lastIndex = breakIterator.first();
    while (BreakIterator.DONE != lastIndex) {
        int firstIndex = lastIndex;
        lastIndex = breakIterator.next();
        if (lastIndex != BreakIterator.DONE && Character.isLetterOrDigit(text.charAt(firstIndex))) {
            words.add(text.substring(firstIndex, lastIndex));
        }
    }

    return words;
}

テスト:

public static void main(String[] args) {
    System.out.println(getWords("A PT CR M0RT BOUSG SABN NTE TR/GB/(G) = Rand(MIN(XXX, YY + ABC))"));
}

出力:

[A, PT, CR, M0RT, BOUSG, SABN, NTE, TR, GB, G, Rand, MIN, XXX, YY, ABC]
12
Ninh Pham

BreakIterator.getWordInstanceを使用することもできます。

11
finnw

このregular expressionを使用して、文字列をそのように分割できます

String l = "sofia, malgré tout aimait : la laitue et le choux !" <br/>
l.split("[[ ]*|[,]*|[\\.]*|[:]*|[/]*|[!]*|[?]*|[+]*]+");
7
sofia

私が考えることができる最も簡単で最良の答えは、Java文字列で定義された次のメソッドを使用することです-

String[] split(String regex)

「これはサンプル文です」.split( "")を実行します。正規表現を使用するため、より複雑な分割を行うこともできます。これには、不要な句読点やその他の文字を削除することも含まれます。

5
James

以下を使用してみてください。

String str = "This is a simple sentence";
String[] strgs = str.split(" ");

これにより、スペースを分割ポイントとして使用して、ストリングの配列の各インデックスにサブストリングが作成されます。

5
Dan Williams

string.replace(".", "").replace(",", "").replace("?", "").replace("!","").split(' ')を使用して、コードをピリオド、コンマ、疑問符、感嘆符のない配列に分割します。必要な数の置換呼び出しを追加/削除できます。

4
helloworld922

これを試して:

String[] stringArray = Pattern.compile("ian").split(
"This is a sample sentence"
.replaceAll("[^\\p{Alnum}]+", "") //this will remove all non alpha numeric chars
);

for (int j=0; i<stringArray .length; j++) {
  System.out.println(i + " \"" + stringArray [j] + "\"");
}
3
Mat B.

以下は、文をWordに分割し、そのカウントも与えるコードスニペットです。

 import Java.util.HashMap;
 import Java.util.Iterator;
 import Java.util.Map;

 public class StringToword {
public static void main(String[] args) {
    String s="a a a A A";
    String[] splitedString=s.split(" ");
    Map m=new HashMap();
    int count=1;
    for(String s1 :splitedString){
         count=m.containsKey(s1)?count+1:1;
          m.put(s1, count);
        }
    Iterator<StringToword> itr=m.entrySet().iterator();
    while(itr.hasNext()){
        System.out.println(itr.next());         
    }
    }

}
2
Eagle

string.replaceAll()は、事前定義されたロケールと異なるロケールでは正しく機能しません。少なくともjdk7u10では。

この例では、Windowsキリル文字セットCP1251を使用してテキストファイルからWord辞書を作成します

    public static void main (String[] args) {
    String fileName = "Tolstoy_VoinaMir.txt";
    try {
        List<String> lines = Files.readAllLines(Paths.get(fileName),
                                                Charset.forName("CP1251"));
        Set<String> words = new TreeSet<>();
        for (String s: lines ) {
            for (String w : s.split("\\s+")) {
                w = w.replaceAll("\\p{Punct}","");
                words.add(w);
            }
        }
        for (String w: words) {
            System.out.println(w);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
1
corvinusz

別の方法は、StringTokenizerです。例:-

 public static void main(String[] args) {

    String str = "This is a sample string";
    StringTokenizer st = new StringTokenizer(str," ");
    String starr[]=new String[st.countTokens()];
    while (st.hasMoreElements()) {
        starr[i++]=st.nextElement();
    }
}
1
Nikunj Gupta

私はすでにこの答えをどこかに投稿しました。もう一度ここでやります。このバージョンでは、主要な組み込みメソッドは使用されません。 char配列を取得し、それを文字列に変換します。役に立てば幸いです!

import Java.util.Scanner;

public class SentenceToWord 
{
    public static int getNumberOfWords(String sentence)
    {
        int counter=0;
        for(int i=0;i<sentence.length();i++)
        {
            if(sentence.charAt(i)==' ')
            counter++;
        }
        return counter+1;
    }

    public static char[] getSubString(String sentence,int start,int end) //method to give substring, replacement of String.substring() 
    {
        int counter=0;
        char charArrayToReturn[]=new char[end-start];
        for(int i=start;i<end;i++)
        {
            charArrayToReturn[counter++]=sentence.charAt(i);
        }
        return charArrayToReturn;
    }

    public static char[][] getWordsFromString(String sentence)
    {
        int wordsCounter=0;
        int spaceIndex=0;
        int length=sentence.length();
        char wordsArray[][]=new char[getNumberOfWords(sentence)][]; 
        for(int i=0;i<length;i++)
        {
            if(sentence.charAt(i)==' ' || i+1==length)
            {
            wordsArray[wordsCounter++]=getSubString(sentence, spaceIndex,i+1); //get each Word as substring
            spaceIndex=i+1; //increment space index
            }
        }
        return  wordsArray; //return the 2 dimensional char array
    }


    public static void main(String[] args) 
    {
    System.out.println("Please enter the String");
    Scanner input=new Scanner(System.in);
    String userInput=input.nextLine().trim();
    int numOfWords=getNumberOfWords(userInput);
    char words[][]=new char[numOfWords+1][];
    words=getWordsFromString(userInput);
    System.out.println("Total number of words found in the String is "+(numOfWords));
    for(int i=0;i<numOfWords;i++)
    {
        System.out.println(" ");
        for(int j=0;j<words[i].length;j++)
        {
        System.out.print(words[i][j]);//print out each char one by one
        }
    }
    }

}
1
Sujal Mandal

ここでの回答のほとんどは、質問に応じて文字列を文字列配列に変換します。ただし、一般的にはListを使用するため、より便利になります-

String dummy = "This is a sample sentence.";
List<String> wordList= Arrays.asList(dummy.split(" "));
0
sapy

次の簡単なコードを使用できます

String str= "This is a sample sentence.";
String[] words = str.split("[[ ]*|[//.]]");
for(int i=0;i<words.length;i++)
System.out.print(words[i]+" ");
0
Rashmi singh