次の内容のテキストファイルがあります。
ac und
accipio annehmen
ad zu
adeo hinzugehen
...
テキストファイルを読み取り、次の行を繰り返します。
Scanner sc = new Scanner(new File("translate.txt"));
while(sc.hasNext()){
String line = sc.nextLine();
}
各行には2つの単語があります。 Javaに次のWordを取得するためのメソッドはありますか、それとも行ストリングを分割して単語を取得する必要がありますか?
Java.util.Scannerのデフォルトの区切り文字は空白なので、必ずしも行を分割する必要はありません。
Whileステートメント内で新しいScannerオブジェクトを作成できます。
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);
}
}
このコード行の次の行はすでに取得されています。
String line = sc.nextLine();
行の単語を取得するには、次の使用をお勧めします。
String[] words = line.split(" ");
Scanner
sを使用すると、すべての行に多数のオブジェクトが生成されます。大きなファイルを使用するGCには、かなりの量のガベージが生成されます。また、split()を使用するよりもほぼ3倍遅くなります。
一方、スペース(line.split(" ")
)で分割した場合、異なる空白区切り文字でファイルを読み取ろうとすると、コードは失敗します。 split()
が正規表現を書くことを期待し、とにかくマッチングを行う場合、代わりにsplit("\\s")
を使用してください。
追伸:申し訳ありませんが、既に与えられた回答についてコメントする権利はありません。
行を読んでから分割する方が良いでしょう。
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();
}
Scannerを使用してWordごとにWordを読み取ることができます。Scanner.next()は次のWordを読み取ります
try {
Scanner s = new Scanner(new File(filename));
while (s.hasNext()) {
System.out.println("Word:" + s.next());
}
} catch (IOException e) {
System.out.println("Error accessing input file!");
}