2011-01-12 24 views
30

necesito mi programa Java para tomar una cadena como:la conversión de una cadena de oración para una matriz de cadenas de palabras en Java

"This is a sample sentence." 

y convertirlo en una matriz de cadenas como:

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

n períodos o puntuación (preferiblemente). Por cierto, la entrada de cadena es siempre una oración.

¿Hay una manera fácil de hacer esto que no estoy viendo? ¿O realmente tenemos que buscar espacios mucho y crear nuevas cadenas desde las áreas entre los espacios (que son palabras)?

+0

También es posible que desee ver en la clase divisor de guayaba: http://guava-libraries.googlecode.com/svn/trunk /javadoc/com/google/common/base/Splitter.html – dkarp

Respuesta

44

String.split() hará la mayor parte de lo que desee. Es posible que deba recorrer las palabras para sacar cualquier puntuación.

Por ejemplo:

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

¿Podría agregar una explicación sobre la expresión regular que utilizó? – Marek

+1

http://docs.oracle.com/javase/tutorial/essential/regex/quant.html – user817129

5

La respuesta más fácil y mejor que se me ocurre es utilizar el siguiente método definido en la serie Java -

String[] split(String regex) 

y sólo hacer "Esta es una muestra oración ".split (" "). Debido a que toma una expresión regular, también puedes dividir más complicado, lo que puede incluir eliminar la puntuación no deseada y otros caracteres similares.

+0

Chicos esta es la solución más simple si una oración no tiene puntuación. – sandalone

4

Utilice string.replace(".", "").replace(",", "").replace("?", "").replace("!","").split(' ') para dividir el código en una matriz sin puntos, comas, signos de interrogación o signos de admiración. Puede agregar/eliminar tantas llamadas de reemplazo como desee.

+0

Correcto, que funciona bien para eliminar la puntuación. – AnimatedRNG

+2

En lugar de llamar a reemplazar 4 veces, sería mejor llamarlo una vez con una expresión regular que capture cualquiera de los 4 elementos. – jzd

3

Prueba esto:

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

string.replaceAll() no funciona correctamente con la configuración regional diferente del predefinido. Al menos en jdk7u10.

En este ejemplo se crea un diccionario de palabras del archivo de texto con CP1251 ventanas juego de caracteres cirílico

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

Sólo puede dividir su cadena como que el uso de esta expresión regulares

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

Bueno para francés. Puede agregar algunas cosas como: "[[] * | [,] * | [;] * | [:] * | ['] * | ['] * | [\\.] * | [:] * | [/] * | [!] * | [?] * | [+] *] + " – blackbox

2

A continuación se presenta un código de fragmento que divide una oración a la palabra y dar su cuenta también.

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

} 
1

Ya publiqué esta respuesta en alguna parte, lo haré aquí de nuevo. Esta versión no usa ningún método incorporado importante. Obtuvo la matriz de caracteres, la convirtió en una cadena. Espero que ayude!

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

} 
9

Puede buscar BreakIterator.getWordInstance para buscar todas las palabras de una cadena.

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

prueba:

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

salida de la señal:

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

no se divide xy, es decir," funny.Does split ", devuelve funny.Does como 1 palabra –

+0

Y probablemente no debería En inglés: el código, lamentablemente, no especifica una configuración regional: las palabras no se dividen por puntos. –

4

Trate de usar la siguiente:

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

que creará una subcadena en cada índice de la matriz de cadenas usando el espacio como un punto de división.

5

Ahora, esto se puede lograr simplemente con split, ya que toma expresión regular:

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

esto le dará las palabras como: {"this","is","a","sample","sentence", "s"}

El \\W+ coincidirá con todos los caracteres no alfabéticos se producen una o más veces . Entonces no hay necesidad de reemplazar. Usted puede verificar otros patrones también.

1

Otra forma de hacerlo es StringTokenizer. por ejemplo: -

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

Puede utilizar el código siguiente sencillo

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