web-dev-qa-db-fra.com

Lire le prochain mot en java

J'ai un fichier texte qui a le contenu suivant:

ac und
accipio annehmen
ad zu
adeo hinzugehen
...

Je lis le fichier texte et je parcours les lignes:

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

Chaque ligne a deux mots. Existe-t-il une méthode dans Java pour obtenir le prochain mot ou dois-je diviser la chaîne de ligne pour obtenir les mots?

22
Upvote

Vous n'avez pas nécessairement à diviser la ligne car le délimiteur par défaut de Java.util.Scanner est un espace.

Vous pouvez simplement créer un nouvel objet Scanner dans votre instruction 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);
        }
    }
25
Christopher Tokar

Vous obtenez déjà la ligne suivante dans cette ligne de votre code:

 String line = sc.nextLine();  

Pour obtenir les mots d'une ligne, je recommanderais d'utiliser:

String[] words = line.split(" ");
12
anon

En utilisant Scanners, vous finirez par générer beaucoup d'objets pour chaque ligne. Vous générerez une quantité décente de déchets pour le GC avec de gros fichiers. En outre, il est presque trois fois plus lent que l'utilisation de split ().

En revanche, si vous séparez par espace (line.split(" ")), le code échouera si vous essayez de lire un fichier avec un délimiteur d'espaces différent. Si split() s'attend à ce que vous écriviez une expression régulière, et que cela corresponde de toute façon, utilisez split("\\s") à la place, qui correspond à un "bit" plus d'espaces qu'un simple caractère espace.

P.S .: Désolé, je n'ai pas le droit de commenter les réponses déjà données.

7
hgj

vous feriez mieux de lire une ligne, puis de faire un fractionnement.

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();
}
3
moldovean

Vous pouvez simplement utiliser Scanner pour lire Word par Word, Scanner.next () lit le prochain 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!");
}
1
user2698038