Conversion d'une chaîne de phrases en un tableau de mots en Java

j'ai besoin de mon programme Java pour prendre une chaîne comme:

"This is a sample sentence."

et le transformer en un tableau de chaîne de la forme:

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

pas de périodes, ni de ponctuation (de préférence). Au fait,la chaîne de caractères est toujours une phrase.

<!-Y a-t-il un moyen facile de faire ça que je ne vois pas? Ou devons-nous vraiment chercher beaucoup d'espaces et créer de nouvelles chaînes à partir des zones entre les espaces (qui sont des mots)?

35
demandé sur AnimatedRNG 2011-01-13 01:44:07

14 réponses

Chaîne de caractères.split () fera la plupart de ce que vous voulez. Vous pouvez alors avoir besoin de boucler les mots pour tirer toute ponctuation.

Par exemple:

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]", "");
}
50
répondu Adam Batkin 2014-11-29 20:21:14

Vous pouvez utiliser BreakIterator.getWordInstance pour trouver tous les mots d'une chaîne.

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

Test:

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

Sortie:

[A, PT, CR, M0RT, BOUSG, SABN, NTE, TR, GB, G, RAND, MIN, XXX, YY, ABC]
12
répondu Ninh Pham 2014-11-03 12:38:10

Maintenant, cela peut être fait simplement avec split comme il faut regex:

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

cela va donner des mots comme: {"this","is","a","sample","sentence", "s"}

\W+ correspond à tous les caractères non-alphabétiques apparaissant une ou plusieurs fois. Donc, il n'est pas nécessaire de remplacer. Vous pouvez consulter d'autres modèles aussi.

12
répondu Ganapathi.D 2016-04-06 17:23:10

Vous pouvez aussi utiliser BreakIterator.getWordInstance.

11
répondu finnw 2011-01-12 22:50:16

Vous pouvez simplement fendre votre chaîne comme ça en utilisant ceci expression

String l = "sofia, malgré tout aimait : la laitue et le choux !" <br/>
l.split("[[ ]*|[,]*|[\.]*|[:]*|[/]*|[!]*|[?]*|[+]*]+");
6
répondu sofia 2013-12-03 23:10:10

la réponse la plus simple et la meilleure à laquelle je puisse penser est d'utiliser la méthode suivante définie sur la chaîne java -

String[] split(String regex)

Et il suffit de faire "Ceci est un exemple de phrase".Split.)" "( Parce qu'il prend un regex, vous pouvez faire des divisions plus compliquées ainsi, qui peuvent inclure la suppression de ponctuation non désirée et d'autres caractères semblables.

5
répondu James 2011-01-12 22:47:41

Utiliser string.replace(".", "").replace(",", "").replace("?", "").replace("!","").split(' ') pour diviser votre code en un tableau sans point, virgule, Point d'interrogation, ou point d'exclamation. Vous pouvez ajouter / supprimer autant d'appels de remplacement que vous le souhaitez.

4
répondu helloworld922 2011-01-12 22:49:26

essayez d'utiliser ce qui suit:

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

qui va créer une sous-chaîne à chaque index du tableau de chaînes en utilisant l'espace comme point de division.

4
répondu Dan Williams 2015-04-15 19:10:30

essaye ceci:

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
répondu Mat B. 2011-01-12 23:13:28

ci-dessous est un extrait de code qui divise un sentense en mot et donne son compte aussi.

 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
répondu Eagle 2014-03-14 15:38:00

chaîne.replaceAll () ne fonctionne pas correctement avec des locales différentes de prédéfinies. Au moins en jdk7u10.

cet exemple crée un dictionnaire de mots à partir de textfile avec le jeu de caractères Cyrillique 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
répondu corvinusz 2013-01-14 14:04:56

j'ai déjà posté cette réponse quelque part, je vais la refaire ici. Cette version n'utilise aucune méthode majeure intégrée. vous avez le tableau char, convertissez-le en chaîne. j'Espère que ça aide!

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
répondu Sujal Mandal 2014-08-24 20:54:42

une autre façon de le faire est 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
répondu Nikunj Gupta 2016-09-10 03:50:16

Vous pouvez utiliser le code simple suivant

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
répondu Rashmi singh 2017-11-09 05:59:22