2011-01-01 13 views
21

Ho un file di testo che è contenuto seguente:Leggi parola successiva in java

ac und 
accipio annehmen 
ad zu 
adeo hinzugehen 
... 

ho letto il file di testo e scorrere le righe:

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

Ogni linea ha due parole. C'è qualche metodo in java per ottenere la parola successiva o devo dividere la stringa per ottenere le parole?

+4

vostro ciclo while dovrebbe leggere 'while (sc.hasNextLine()) {' – BoltClock

+1

È questo un allenatore vocabolo tedesco/latino? – RoflcoptrException

+1

sì, un po 'di esercizio sull'utilizzo di file e hashmap –

risposta

23

che non necessariamente hanno dividere la riga perché il delimitatore predefinito di java.util.Scanner è uno spazio bianco.

È possibile semplicemente creare un nuovo oggetto Scanner all'interno dell'istruzione 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

Voglio memorizzare le parole in una hashmap, quindi ogni iterazione del secondo ciclo dovrebbe coprire le parole. è possibile avere s1.next() due volte e fare qualcosa del genere: map.put (s1.next(), s1.next())? –

+0

Sì, dovrebbe funzionare finché la formattazione del file è corretta. –

12

È già ottenere la riga successiva in questa linea di codice:

String line = sc.nextLine(); 

Per ottenere le parole di una linea, mi sento di raccomandare di utilizzare:

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

è possibile applicare uno scanner alla linea e scansionare la linea usando next? –

+3

Sì, allora dovresti modificare il tuo ciclo while: while (sc.hasNextLine()) –

7

Utilizzando Scanner s, si finirà per la deposizione delle uova un sacco di oggetti per ogni linea. Genererai una discreta quantità di spazzatura per il GC con file di grandi dimensioni. Inoltre, è quasi tre volte più lento rispetto all'utilizzo di split().

D'altra parte, se si divide per spazio (line.split(" ")), il codice non funzionerà se si tenta di leggere un file con un delimitatore di spazi bianchi diverso. Se split() si aspetta che tu scriva un'espressione regolare, e lo fa ugualmente, usa invece split("\\s") che corrisponde a un "bit" più spazio bianco rispetto a un semplice carattere di spazio.

P.S .: Siamo spiacenti, non ho il diritto di commentare le risposte già fornite.

3

è meglio leggere una linea e poi fare una divisione.

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 perché mi manca anche C – Gab

+1

@ Gab ... in nessun tempo, farai un lavoro Java :) – moldovean