String fileName="words.txt"; //words.txt file contains 25,000 words
    String word;

    try {

    FileReader fileReader=new FileReader(fileName);
    BufferedReader bufferReader;

    ArrayList<String> arrBag;

    int count;
    bufferReader=new BufferedReader(fileReader);

    for (int i=1;i<=maxWordLength;i++)  //maxWordLength is 22
    {
        arrBag = new ArrayList<String> (); // arrBag contains all words with same length and then store to hash map.

        count=0;

        bufferReader.mark(0);
        while((word=bufferReader.readLine())!=null)
        {
            if (word.length()==i)
            {
                arrBag.add(word);
                count++;
            }
        }

        System.out.println("HashMap key : "+i+" has bag count : "+count);
        mapBagOfTasks.put(Integer.toString(i), arrBag);  //mapBagOfTasks is HashMap where key is length of word and value is ArrayList of words with same length.

        bufferReader.reset();

    }
    if (fileReader!=null)
    {
        fileReader.close();
    }



}
catch (FileNotFoundException e) {
    System.out.println("Input file not found");
    e.printStackTrace();
}
catch (IOException e) {
    System.out.println("Error while reading File '"+fileName+"'");
    e.printStackTrace();
}


我有一个包含25,000个单词的“ words.txt”文件。我想将所有具有相同长度的单词存储到ArrayList中,然后将其存储为Hash映射作为键:单词和值的长度为数组列表。

我面临的问题是我的程序第一次读取文件,但不会再次读取同一文件。我尝试使用mark()和reset()函数,但再次遇到相同的问题。您可以看到输出的理由。我该如何解决这个问题?

我的程序输出是:
文件中的最大字长:22
HashMap键:1的包数:26 //(意味着找到第1个lenth中有26个单词)
HashMap密钥:2的包数:0
HashMap密钥:3的包数:0
HashMap密钥:4的包数:0
HashMap键:5的包数:0
HashMap密钥:6的包数:0
HashMap键:7,包数:0
HashMap键:8,包数:0
HashMap键:9,包数:0
HashMap密钥:10的包数:0
HashMap键:11的包数:0
HashMap键:12的包数:0
HashMap键:13的包数:0
HashMap键:14的包数:0
HashMap键:15的包数:0
HashMap键:16的包数:0
HashMap键:17的包数:0
HashMap密钥:18,包数:0
HashMap密钥:19的包数:0
HashMap密钥:20,包数:0
HashMap键:21的包数:0
HashMap键:22的包数:0

最佳答案

相对于处理内存中的数据,从磁盘读取是一项昂贵的操作,因此您只应读取一次文件。我建议你做这样的事情:

    Map<Integer, List<String>> lengthToWords = new HashMap<>();
    while ((word = bufferReader.readLine()) != null) {
        int length = word.length();
        if (length < maxWordLength) {
            if (!lengthToWords.containsKey( length ))
                lengthToWords.put( length, new ArrayList<>() );
            lengthToWords.get( length ).add( word );
        }
    }

10-07 18:06