2011-01-01 15 views
21

Tengo un archivo de texto que ha contenido siguiente:Leer siguiente palabra en Java

ac und 
accipio annehmen 
ad zu 
adeo hinzugehen 
... 

leí el archivo de texto y iterar a través de las líneas:

Scanner sc = new Scanner(new File("translate.txt")); 
while(sc.hasNext()){ 
String line = sc.nextLine();  
} 

Cada línea tiene dos palabras. ¿Hay algún método en Java para obtener la siguiente palabra o tengo que dividir la línea para obtener las palabras?

+4

Su bucle while debe decir 'while (sc.hasNextLine()) {' – BoltClock

+1

Es este un entrenador vocablo alemán/latino? – RoflcoptrException

+1

sí, un pequeño ejercicio sobre el uso de archivos y hashmaps –

Respuesta

23

que no necesariamente tienen para dividir la línea porque el delimitador predeterminado de java.util.Scanner es el espacio en blanco.

Puede simplemente crear un nuevo objeto Scanner dentro de su sentencia while.

Scanner sc2 = null; 
    try { 
     sc2 = new Scanner(new File("translate.txt")); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    while (sc2.hasNextLine()) { 
      Scanner s2 = new Scanner(sc2.nextLine()); 
     while (s2.hasNext()) { 
      String s = s2.next(); 
      System.out.println(s); 
     } 
    } 
+0

Quiero almacenar las palabras en un hashmap, por lo que cada iteración del segundo ciclo debe cubrir las palabras. ¿es posible tener s1.next() dos veces y hacer algo como eso: map.put (s1.next(), s1.next())? –

+0

Sí, eso debería funcionar siempre que el formateo de su archivo sea correcto. –

12

ya obtiene la siguiente línea en esta línea de código:

String line = sc.nextLine(); 

para que las palabras de una línea, yo recomendaría usar:

String[] words = line.split(" "); 
+0

¿es posible aplicar un escáner a la línea y escanear la línea con la siguiente? –

+3

Sí, entonces debe modificar su ciclo while: while (sc.hasNextLine()) –

7

Usando Scanner s, el resultado final será el desove una gran cantidad de objetos para cada línea. Generará una cantidad decente de basura para el GC con archivos grandes. Además, es casi tres veces más lento que usando split().

Por otro lado, si divide por espacio (line.split(" ")), el código fallará si intenta leer un archivo con un delimitador de espacios en blanco diferente. Si split() espera que escriba una expresión regular, y coincide de todos modos, use split("\\s") en su lugar, que coincida con un "bit" más de espacio en blanco que solo un carácter de espacio.

P.S .: Lo siento, no tengo derecho a comentar las respuestas ya dadas.

3

es mejor que lea una línea y luego haga una división.

File file = new File("path/to/file"); 
String words[]; // I miss C 
String line; 
HashMap<String, String> hm = new HashMap<>(); 
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"))) 
{ 
    while((line = br.readLine() != null)){ 
     words = line.split("\\s"); 
     if (hm.containsKey(words[0])){ 
       System.out.println("Found duplicate ... handle logic"); 
     } 
     hm.put(words[0],words[1]); //if index==0 is ur key 
    } 

} catch (FileNotFoundException e) { 
     e.printStackTrace(); 
} catch (IOException e) { 
     e.printStackTrace(); 
} 
+0

upvote porque extraño C también – Gab

+1

@Gab ... en un momento dado, obtendrás un trabajo en Java :) – moldovean

Cuestiones relacionadas