it-roy-ru.com

Преобразование строки предложения в массив слов в Java

Мне нужна моя Java-программа, чтобы взять строку вроде:

"This is a sample sentence."

и превратить его в массив строк, например:

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

Никаких точек или знаков препинания (желательно). Кстати, строка ввода всегда состоит из одного предложения.

Есть ли простой способ сделать это, чего я не вижу? Или мы действительно должны много искать пробелы и создавать новые строки из областей между пробелами (которые являются словами)?

35
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]", "");
}
52
Adam Batkin

Теперь это можно сделать с помощью split, так как для этого требуется регулярное выражение:

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

это даст слова как: {"this","is","a","sample","sentence", "s"}

Код \\W+ будет соответствовать всем не алфавитным символам, встречающимся один или несколько раз. Таким образом, нет необходимости заменять. Вы также можете проверить другие шаблоны.

15
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

Вы можете просто разделить вашу строку, используя это регулярное выражение

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 .

В этом примере создается словарь Word из текстового файла с кодировкой кириллицы Windows CP1251.

    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 . Ex: -

 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

Я уже опубликовал этот ответ где-нибудь, я сделаю это здесь снова. Эта версия не использует какой-либо основной встроенный метод. Вы получили массив символов, преобразовать его в строку. Надеюсь, поможет!

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

Вы можете использовать простой следующий код

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