2017-10-20 9 views
0

besoin d'obtenir en quelque sorte ces deux fichiers txt pour servir de clé et de valeurs, j'ai eu le premier dans la liste de travail, mais j'ai besoin de tous les mots mappés à partir des deux fichiers txt .. je pense ce qui se passe est im ne pas analyser les fichiers correctement. Je suis capable de System.out.println (..) le contenu mais je reçois une valeur nulle pour les valeurs, donc il me manque quelque chose de grand ici. de toute façon nouveau programmeur ici c'est mon premier post. salut! =)hashmap et plusieurs fichiers txt java

import java.util.*; 
import java.io.*; 



public class Main { 

    public static void main(String[] args) throws IOException { 


     //Create map structure **must have import 


     Map engJapDictionary = new HashMap<String,String>(); 

     //user input 
     Scanner in = new Scanner(System.in); 
     System.out.print("Enter phrase for translation: "); 

     //name the user input 
     String name = in.next(); 
     System.out.println("You wrote: " + name); 


     //Load Eng and Jap 
     String fileName = "word.txt"; 
     String fileName1 = "word2.txt"; 
     String line = null; 
     String line2= null; 


     try { 

      FileReader fileReader = new FileReader(fileName); 
      FileReader fileReader1 = new FileReader(fileName1); 

      BufferedReader bufferedReader = new BufferedReader(fileReader); 
      BufferedReader bufferedReader1 = new BufferedReader(fileReader1); 

      while ((line = bufferedReader.readLine()) != null) { 
       String parts[] = line.split("\t"); 

      while ((line2 = bufferedReader1.readLine()) != null) { 
       String parts2[] = line2.split("\t"); 

       engJapDictionary.put(parts[0], parts2[0]); 


       //for each entry in both txt files iterate through i think here. the .put works only for the first entry in both txt files.. =(


       continue; 

       //System.out.println(engJapDictionary +"\n"); 
       //System.out.println(line); 

      } 
      } 

     }catch (IOException e){} 

     //Size of the Dictionary! 

     System.out.println("The number of entries is: " + engJapDictionary.size()); 


     // English to Japanese Dictionary 


     //Building dictionary the long way 


     engJapDictionary.put("me", "Watashi"); 
     engJapDictionary.put("you", "anata"); 
     engJapDictionary.put("hat", "boshi"); 
     engJapDictionary.put("cat", "neko"); 
     engJapDictionary.put("dream", "yume"); 
     engJapDictionary.put("house", "uchi"); 
     engJapDictionary.put("dog", "inu"); 


//  System.out.println(engJapDictionary.get("you")); 
//  System.out.println(engJapDictionary.get("hat")); 
//  System.out.println(engJapDictionary.get("cat")); 
//  System.out.println(engJapDictionary.get("dream")); 
//  System.out.println(engJapDictionary.get("house")); 
//  System.out.println(engJapDictionary.get("dog")); 



     System.out.println("Japanese word: " + engJapDictionary.get(name)); 
     System.out.println(engJapDictionary.get(name)); 
     System.out.println(engJapDictionary.containsKey(name)); 


     //Print the keys!! 

     //System.out.println("\n" + engJapDictionary.keySet()); 


     //Print the values!! 

     //System.out.println(engJapDictionary.values()); 


    } 
} 
+1

Je parie que vous verrez l'erreur sans aucune aide si vous formatez votre code correctement. http://idownvotedbecau.se/noattempt/ – blafasel

+0

ne pensais pas que je devais être flammé si tôt. =) je vois votre point cependant, le formatage est vraiment important .. contrôle k n'a pas semblé fonctionner pour moi en apportant mes trucs d'intellij. il est juste tout mucked .. –

Répondre

2

Vous appelez engJapDictionary.put(parts[0], parts2[0]); pour le premier mot du premier fichier avec tous les mots du second fichier. Ensuite, vous ne mettez pas d'autres mots du premier fichier dans le Map, puisque vous avez terminé l'itération sur le deuxième fichier dans la première exécution de la boucle interne, alors line2 = bufferedReader1.readLine() renvoie .

Vous n'avez pas besoin d'une boucle imbriquée, une seule boucle qui lit une ligne à partir des deux fichiers à chaque itération:

while ((line = bufferedReader.readLine()) != null && (line2 = bufferedReader1.readLine()) != null) { 
    String parts[] = line.split("\t"); 
    String parts2[] = line2.split("\t"); 
    engJapDictionary.put(parts[0], parts2[0]); 
} 
+2

vous êtes si rapide –

+0

merci pour la solution rapide .. je vais réfléchir sur ce =) –

0

Eran est bon jusqu'à présent; une explication supplémentaire: dans la première exécution de la boucle externe, la boucle interne remplacera la première entrée par la suite avec tous les mots du deuxième fichier de sorte que seul le dernier mot restera sur la carte. La boucle suivante ne trouve plus rien dans le second fichier, car elle est déjà lue, donc vous obtenez des valeurs null pour les autres entrées. Mais je vous recommande fortement un autre design! Le problème avec les deux fichiers est que vous devez gérer les données à deux endroits totalement différents. Imaginez que vous ajoutez un nouveau mot, mais par accident vous les placez à des lignes différentes dans les deux fichiers – tous les mots entre les deux indices concernés seront gâtés ... Ou ce qui se passe, si vous n'ajoutez pas le mot à l'un des fichiers du tout ???

Préférez un seul fichier avec des entrées telles que:

<english word>=<japanese word> 

Ensuite, vous avez tous les mots correspondants réunis et vous êtes à l'abri des erreurs comme ci-dessus. Vous itérer sur un fichier, diviser les lignes par "=", et remplissez la carte avec

put(parts[0].trim(), parts[1].trim()); 
+0

nice! ses seuls mots 10k, je vais trouver un moyen de fusionner des fichiers txt puis le faire marcher .. il a été beaucoup de plaisir jusqu'à présent ..! merci ami –

+0

@ T.M. Eh bien, vous pouvez utiliser votre code actuel (variante fixe, bien sûr) pour: Ouvrir un autre (troisième fichier) et au lieu de mettre les entrées sur la carte les écrire dans le fichier: 'file.printf ("% s =% s \ n ", parties [0] .trim(), parties [1] .trim());' – Aconcagua

+0

pour une raison quelconque, je ne peux pas sembler utiliser fichier.printf, je ne pouvais que résoudre quelque chose comme. System.out.printf ("% s =% s \ n", parties [0] .trim(), parts2 [0] .trim()); –