2011-01-01 3 views
21

У меня есть текстовый файл, который имеет следующее содержание:Читать следующее слово в Java

ac und 
accipio annehmen 
ad zu 
adeo hinzugehen 
... 

Я прочитал текстовый файл и перебирать строки:

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

Каждая строка содержит два слова. Есть ли какой-либо метод в java для получения следующего слова или мне нужно разделить строку, чтобы получить слова?

+4

Ваш цикл в то время как следует читать 'While (sc.hasNextLine()) {' – BoltClock

+1

Является ли это немецкий/латинского произносимый тренера? – RoflcoptrException

+1

Да, небольшое упражнение по использованию файлов и хэш-карт –

ответ

23

Вам не обязательно для разделения строки, поскольку java.util.Scanner по умолчанию разделитель является пробелом.

Вы можете просто создать новый объект сканера в операторе 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

Я хочу хранить слова в хэш-карте, поэтому каждая итерация второго цикла должна охватывать слова. возможно ли иметь s1.next() дважды и сделать что-то вроде этого: map.put (s1.next(), s1.next())? –

+0

Да, это должно работать до тех пор, пока форматирование вашего файла будет правильным. –

12

Вы уже получаете следующую строку в этой строке кода:

String line = sc.nextLine(); 

Чтобы получить слова строки, я бы рекомендовал использовать:

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

можно ли применить сканер к линии и сканировать строку, используя следующий? –

+3

Да, тогда вы должны модифицировать свой цикл while: while (sc.hasNextLine()) –

7

Использование Scanner с, вы будете в конечном итоге нерест много объектов для каждой строки. Вы создадите приличное количество мусора для GC с большими файлами. Кроме того, он почти в три раза медленнее, чем использование split().

С другой стороны, если вы разделите пробел (line.split(" ")), код будет терпеть неудачу, если вы попытаетесь прочитать файл с другим разделителем пробелов. Если split() ожидает, что вы будете писать регулярное выражение, и оно все равно будет соответствовать, используйте вместо этого split("\\s"), который соответствует «бит» больше пробелов, чем просто символ пробела.

P.S .: Извините, я не имею права комментировать уже предоставленные ответы.

3

вам лучше читать строку, а затем делать раскол.

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, потому что я скучаю по С слишком – Gab

+1

@Gab ... в незапамятные сроки вы приземлитесь на Java-работу :) – moldovean

Смежные вопросы