Создание HashMap из текстового файла с помощью Buffered Reader?

У меня возникают проблемы с кодированием метода, который с аргументом, именем файла, читает файл, который будет содержать слова, и создает Hashmap с ключом в качестве первой буквы, например. для слова в файле, например, «яблоко», ключом является «а», а значение - «яблоко».

Код, который у меня есть сейчас:

public class WordStore {
HashMap<String, List<String>> map;
File filename;

public WordStore() {
     map = new HashMap<String, List<String>>();
}

public WordStore(File file) throws IOException {
    map = new HashMap<String, List<String>>();
    BufferedReader br = null;
    //k = "/Users/hon/eclipse-workspace/Assignment4/src/wordbank.txt"
    try{
        File filename = new File(k);
        FileReader fr = new FileReader(filename);
        br = new BufferedReader(fr);    
        while(br.readLine()!=" ") {
        String word ="";
        word = br.readLine();
        String key = ""+(word.charAt(0));
        map.put(key, word);
        }

    }
    catch(IOException e) {
        System.out.println("File not found exception caught!");
    }
    finally {
        if(br != null) {
            try {
                br.close();
            }
        catch(IOException e) {
            e.printStackTrace();
        }
        }
    }

}
public void put(String key, String word) {
    if(map.containsKey(key)) {
        (map.get(key)).add(word);
    }
    else {
    List<String> names = new ArrayList<>();
    names.add(word);
    map.put(key, names);
    }
}
}

У меня есть ошибка в конструкторе WordStore (файл файла) в map.put (key, word), в котором говорится, что метод put(String, List<String>) в типе HashMap<String, List<String>> неприменим для аргумента (String, String).

Я попытался переименовать свой метод размещения, чтобы он использовал мой метод, а не метод размещения хэш-карты, но это тоже не работает.


person halo2x2    schedule 15.02.2018    source источник
comment
измените свою карту на map = new HashMap ‹String, String› ();   -  person isaace    schedule 15.02.2018
comment
ваш put метод не является методом map, для его вызова просто используйте put(key, word);   -  person Loris Securo    schedule 15.02.2018


Ответы (2)


Вы пытаетесь поместить значение String там, где ожидается List. Это потому, что вы вызвали обычный put метод map. Вместо этого вызовите свой собственный метод put, который уже обрабатывает списки.

put(key, word);

Кроме того, вы читаете файл неправильно. Во-первых, вы сравниваете строки с !=, что неверно. Затем вы вызываете readLine дважды за цикл. Вершина петли должна быть:

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

Это считывает строку и сравнивает ее с null в той же строке, чтобы проверить наличие конца файла.

person rgettman    schedule 15.02.2018
comment
Спасибо за помощь и простое, но понятное объяснение. - person halo2x2; 15.02.2018

Вы создали put метод, и это нормально, но вы его не вызываете. Вместо этого вы используете "оригинальный" put метод map.

Поэтому измените первый экземпляр map.put на put.

person Valdi_Bo    schedule 15.02.2018