Подтвердить что ты не робот

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

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

"This is a sample sentence."

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

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

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

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

4b9b3361

Ответ 1

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]", "");
}

Ответ 3

Вы можете использовать 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))"));
}

Ouput:

[A, PT, CR, M0RT, BOUSG, SABN, NTE, TR, GB, G, RAND, MIN, XXX, YY, ABC]

Ответ 4

Самый простой и лучший ответ, который я могу придумать, - использовать следующий метод, определенный в строке java -

String[] split(String regex)

И просто сделайте "Это примерное предложение".split(""). Поскольку это требует регулярного выражения, вы также можете выполнять более сложные расщепления, которые могут включать удаление ненужной пунктуации и других таких символов.

Ответ 5

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

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

Ответ 6

Используйте string.replace(".", "").replace(",", "").replace("?", "").replace("!","").split(' ') для разделения вашего кода на массив без периодов, запятых, вопросительных знаков или восклицательных знаков. Вы можете добавлять/удалять как можно больше вызовов для звонков.

Ответ 7

Попробуйте следующее:

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] + "\"");
}

Ответ 8

Попробуйте использовать следующее:

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

Это создаст подстроку для каждого индекса массива строк, используя пробел в качестве точки разделения.

Ответ 9

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

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

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

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

Ответ 10

Ниже приведен фрагмент кода, который разбивает текст на слово и дает его счет.

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

}

Ответ 11

string.replaceAll() неправильно работает с языковой версией, отличной от предопределенной. По крайней мере, в jdk7u10.

В этом примере создается словарь слов из текстового файла с кириллической кодировкой 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();
    }

Ответ 12

Я уже где-то публиковал этот ответ, я сделаю это здесь снова. Эта версия не использует какой-либо основной встроенный метод. Вы получили массив 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
        }
    }
    }

}

Ответ 13

Другой способ сделать это - 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();
    }
}

Ответ 14

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

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