hashmap和多个txt文件java

时间:2017-10-20 08:56:09

标签: java hashmap

需要以某种方式获取这两个txt文件作为我的键和值,我得到列表中的第一个工作,但需要从两个txt文件映射所有单词..我认为发生了什么是我不解析正确地通过文件。我能够System.out.println(..)的内容,但我收到的值为null,所以我在这里缺少一些大的东西。无论如何新程序员在这里这是我的第一篇文章。您好! =)

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());


    }
}

2 个答案:

答案 0 :(得分:2)

您正在使用第二个文件的所有单词为第一个文件的第一个单词调用engJapDictionary.put(parts[0], parts2[0]);。然后,您不会在Map中放置第一个文件的任何其他单词,因为您在内循环的第一次运行中完成了对第二个文件的迭代,因此line2 = bufferedReader1.readLine()返回null }。

您不需要嵌套循环,只需要在每次迭代中从两个文件中读取一行的单个循环:

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]);
}

答案 1 :(得分:0)

到目前为止,伊兰是正确的;一些额外的解释:在外部循环的第一次运行中,内部循环将随后用第二个文件的所有单词替换第一个条目,以便只有最后一个单词将保留在地图中。下一个循环运行不再在第二个文件中找到任何内容,因为它已经被委托读取,因此您可以获得更多条目的null值。

但我强烈推荐你另一种设计!这两个文件的问题是您需要在两个完全不同的位置管理数据。想象一下,你添加了一个新单词,但不小心你将它们放在两个文件中的不同行 - 受影响的两个索引之间的所有单词都会被破坏......或者如果你没有将单词添加到一个单词中,会发生什么所有文件???

首选包含以下条目的单个文件:

<english word>=<japanese word>

然后你将所有相应的单词连接在一起,你就可以避免上述错误。您迭代一个文件,将行拆分为"=",然后用

填充地图
put(parts[0].trim(), parts[1].trim());