2011-01-01 14 views
21

Mam plik tekstowy, który ma następującą zawartość:Czytaj następny wyraz w java

ac und 
accipio annehmen 
ad zu 
adeo hinzugehen 
... 

Czytam plik tekstowy i iterację linie:

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

Każda linia ma dwa słowa. Czy istnieje jakakolwiek metoda w języku Java, aby uzyskać następne słowo lub czy muszę podzielić ciąg linii, aby uzyskać słowa?

+4

Twój pętli while powinien przeczytać 'while (sc.hasNextLine()) {' – BoltClock

+1

Czy ta niemiecka/latin vocable trenera? – RoflcoptrException

+1

tak, małe ćwiczenie na korzystaniu z plików i hashmapów –

Odpowiedz

23

Nie koniecznie mieć aby podzielić linię, ponieważ domyślnym ograniczeniem java.util.Scanner jest białe znaki.

Możesz po prostu utworzyć nowy obiekt skanera w instrukcji 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

Chcę zachować słowa w hashmapie, więc każda iteracja drugiej pętli powinna obejmować słowa. czy możliwe jest dwukrotne s1.next() i zrobienie czegoś takiego: map.put (s1.next(), s1.next())? –

+0

Tak, to powinno działać tak długo, jak formatowanie pliku jest poprawne. –

12

Już dostać następną linię w tej linii kodu:

String line = sc.nextLine(); 

dostać słowa wiersza, polecam używać:

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

Czy możliwe jest zastosowanie skanera do linii i zeskanowanie linii za pomocą następnej? –

+3

Tak, powinieneś zmodyfikować swoją pętlę while: while (sc.hasNextLine()) –

7

Korzystanie Scanner s, skończy się tarło dużo obiektów dla każdej linii. Wygenerujesz przyzwoitą ilość śmieci dla GC z dużymi plikami. Ponadto jest prawie trzy razy wolniejszy niż przy użyciu metody split().

Z drugiej strony, jeśli podzielisz spacją (line.split(" ")), kod nie powiedzie się, jeśli spróbujesz odczytać plik z innym ogranicznikiem odstępu. Jeśli split() spodziewa się, że napiszesz wyrażenie regularne, a mimo to pasuje, użyj zamiast tego wartości split("\\s"), która dopasuje "bit" do więcej niż spacji.

P.S .: Przykro nam, nie mam prawa komentować odpowiedzi już udzielonych.

3

lepiej odczytywać linię, a następnie robić podział.

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

zbieram, bo tęsknię za C też – Gab

+1

@Gab ... w żadnym momencie, nie wylądujesz pracy Java :) – moldovean