Как читать один и тот же текстовый файл снова и снова, используя BufferedReader? - PullRequest
0 голосов
/ 17 октября 2018
    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();
}

У меня есть файл "words.txt", который содержит 25 000 слов.Я хочу сохранить все слова одинаковой длины в ArrayList, а затем сохранить его в Hash map в качестве ключа: длина слова и значения - это массив List.

Проблема, с которой я столкнулся, заключается в том, что моя программа прочитала файл в первый разно не читает тот же файл снова.Я попытался использовать функции mark () и reset (), но снова столкнулся с той же проблемой.Вы можете увидеть вывод для обоснований.Как я могу решить эту проблему?

Мой вывод программы: максимальная длина слова в файле: 22 * ​​1007 * Ключ HashMap: 1 имеет количество сумок: 26 // (означает, что найдено 26 слов издлина 1)
ключ 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

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

IO обычно самая медленная часть любой программы.Если вы не имеете дело с файлами, размер которых превышает доступное количество оперативной памяти, вы должны прочитать весь файл один раз в оперативную память и затем поработать с ним там.Исходя из вашего описания того, что вы пытаетесь сделать, это код, который я бы написал.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

public class WordLength {

    public static void main(String[] args) {

        String fileName = "words.txt";
        int maxWordLength = 0;

        HashMap<Integer, ArrayList<String>> mapBagOfTasks = new HashMap<>();

        // populate the HashMap
        try {
            BufferedReader br = new BufferedReader(new FileReader(fileName));

            String word = "";
            while ((word=br.readLine())!=null) {

                int count = word.length();
                if (count>maxWordLength) {
                    maxWordLength = count;
                }

                // if an array list for words of length count is not in the map. put in a new one
                if (!mapBagOfTasks.containsKey(count)) {
                    mapBagOfTasks.put(count, new ArrayList<>());
                }

                // get the array list for words of length count
                ArrayList<String> arrBag = mapBagOfTasks.get(count);

                // add word to that array list
                arrBag.add(word);

            }

            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // loop over all of the keys and their values
        for (int key=0; key<maxWordLength; key++) {
            if (mapBagOfTasks.containsKey(key)) {
                ArrayList<String> value = mapBagOfTasks.get(key);

                System.out.println("HashMap key : "+key+" has bag count "+value.size());
            } else {
                System.out.println("HashMap key : "+key+" has bag count 0");
            }
        }
    }
}
0 голосов
/ 18 октября 2018

Чтение с диска - дорогостоящая операция по сравнению с работой с данными в памяти, поэтому вы должны прочитать файл только один раз.Я предлагаю вам сделать что-то вроде этого:

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