HashMap containsKey всегда возвращает false для одной и той же строки

Я анализирую файл, в котором у меня есть названия городов и расстояния до других городов в этом формате:

"San Antonio" 
"San Francisco" 
Washington 

"San Francisco"--Weed [305]
"San Francisco"--"Wisconsin Dells" [2189]
Washington--"San Jose" [2909]

Я думаю, что проблема в том, что когда я нарезаю строки, создаются разные объекты, и по какой-то причине String.equals и/или hashcode() дают разные результаты. Из-за этого Map.get(key) возвращает нулевые значения. Однако я не знаю, как это исправить.

public class spanning {
private static HashMap<String, HashMap<String, Integer>> map = new HashMap<String, HashMap<String, Integer>>();
public static void main(String[] args) throws IOException {
    BufferedReader read = new BufferedReader(new FileReader(args[0]));
    String temp;
    while ((temp = read.readLine()) != null) {
        if (temp.contains("[")) {
            String[] parts = temp.split("--");
            String[] parts2 = parts[1].split(" \\[");
            Scanner scan;
            scan = new Scanner(parts2[1]).useDelimiter("\\D");
            int o = scan.nextInt();
            map.get(parts[0]).put(parts2[0], o);
        } else {
            map.put(temp, new HashMap<String, Integer>());

        }
    }
    System.out.println("Finished!");
}

}


person Slayahh    schedule 01.05.2018    source источник
comment
String.equals() будет сравнивать текст в случае строк. У вас есть пример того, что именно не удалось?   -  person achAmháin    schedule 01.05.2018
comment
Да, я добавил строку boolean test = map.containsKey(parts[0]) выше map.get(), и она вернула false   -  person Slayahh    schedule 01.05.2018
comment
Если вы печатаете parts[0] и ключи с карты, существует ли в ней parts[0]?   -  person achAmháin    schedule 01.05.2018
comment
Вы помещаете весь temp в хэш-карту в качестве ключа, а не parts[0]- вы хотели это сделать? В этом else проверьте, как выглядит temp, прежде чем вставить его.   -  person David Lavender    schedule 01.05.2018
comment
Если temp не содержит расстояния, он просто отображается на карте как Сан-Антонио или Вашингтон. Сейчас попробую то, что сказал @notyou.   -  person Slayahh    schedule 01.05.2018
comment
Я нашел ошибку, я думаю, похоже, что все мои данные о городах имеют лишние пробелы после них, поэтому я попытаюсь удалить это и попробовать еще раз, спасибо.   -  person Slayahh    schedule 01.05.2018


Ответы (1)


Я запустил ваш код, и ниже приведена карта, когда она достигает строки, которая печатает «Готово»:

map = {HashMap@634}  size = 4
 0 = {HashMap$Node@640} "" -> " size = 0"
 1 = {HashMap$Node@641} ""San Antonio"" -> " size = 0"
  key = ""San Antonio""
  value = {HashMap@647}  size = 0
 2 = {HashMap$Node@642} ""San Francisco"" -> " size = 2"
  key = ""San Francisco""
  value = {HashMap@649}  size = 2
   0 = {HashMap$Node@654} "Weed" -> "305"
   1 = {HashMap$Node@655} ""Wisconsin Dells"" -> "2189"
 3 = {HashMap$Node@643} "Washington" -> " size = 1"
  key = "Washington"
  value = {HashMap@651}  size = 1
   0 = {HashMap$Node@662} ""San Jose"" -> "2909"

В чем именно заключалась проблема? Вы видели, каковы были значения вашей карты прямо перед тем, как она вышла из метода?

person Bilguun    schedule 01.05.2018