java класс, расширяющий HashMap метод перезаписи положить не работает - PullRequest
0 голосов
/ 12 марта 2020

Привет, у меня проблема с этим моим классом:

public class JarClassMethod extends HashMap<String,HashMap<String, List<String>>> {
    public JarClassMethod() {
        super();
    }

    public List<String> get(String jar,String classe) {
        return get(jar).get(classe);
    }

    public void put(String jar, String classe, List<String> metodi) {

        Map<String,List<String>> map2 = new HashMap<>();
        map2.put(classe, metodi);
        this.put(jar, (HashMap<String, List<String>>) map2);
    }

}

если вызов помещен в цикл for, я в конце вижу только последнее значение в моем объекте MAP!

пример:

{"jar1":{classe1:[s,adas,da,sd],
         classe2:[asda,fdd,ass],
        },
"jar2":{classe3:[s,adas,da,sd],
         classe4:[asda,fdd,ass],
        }
}

Спасибо С уважением

Ответы [ 2 ]

1 голос
/ 12 марта 2020

A Map заменяет предыдущее значение, если вы добавили новое значение для существующего ключа. Проверьте документацию , в которой говорится:

Если карта ранее содержала сопоставление для ключа, старое значение заменяется указанным значением.

Проверьте свой l oop, если вы всегда звоните put с одним и тем же ключом. Если да, в конце, Map будет иметь только одно значение, которое является последним введенным в него значением.

Убедитесь, что создан новый объект, на который ссылается map2, как показано ниже:

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Testing {
    public static void main(String[] args) {
        HashMap<String,HashMap<String, List<String>>> map=new HashMap<String,HashMap<String, List<String>>>();
        Map<String,List<String>> map2;      

        map2= new HashMap<>();      
        map2.put("classe1",List.of("s","adas","da","sd"));
        map2.put("classe2",List.of("asda","fdd","ass"));
        map.put("jar1", (HashMap<String, List<String>>) map2);      
        System.out.println(map);

        map2= new HashMap<>();
        map2.put("classe3",List.of("s","adas","da","sd"));
        map2.put("classe4",List.of("asda","fdd","ass"));
        map.put("jar2", (HashMap<String, List<String>>) map2);
        System.out.println(map);
    }
}

Вывод:

{jar1={classe2=[asda, fdd, ass], classe1=[s, adas, da, sd]}}
{jar2={classe4=[asda, fdd, ass], classe3=[s, adas, da, sd]}, jar1={classe2=[asda, fdd, ass], classe1=[s, adas, da, sd]}}
0 голосов
/ 12 марта 2020

Ваш метод put заменяет внутреннюю карту для данного ключа jar, поэтому будет сохранена только последняя classe для данного ключа jar. Вы должны помещать новый внутренний HashMap только тогда, когда ключ jar не имеет его.

Реализация метода должна быть:

public void put(String jar, String classe, List<String> metodi) {
    computeIfAbsent(jar, k -> new HashMap<>()).put(classe, metodi);
}

Кроме того, чтобы предотвратить NullPointerException Ваш get метод должен быть:

public List<String> get(String jar, String classe) {
    HashMap<String, List<String>> classeMap = get(jar);
    return (classeMap == null ? null : classeMap.get(classe));
}

Тест

JarClassMethod jcm = new JarClassMethod();
jcm.put("jar1", "classe1", Arrays.asList("s","adas","da","sd"));
jcm.put("jar1", "classe2", Arrays.asList("asda","fdd","ass"));
jcm.put("jar2", "classe3", Arrays.asList("s","adas","da","sd"));
jcm.put("jar2", "classe4", Arrays.asList("asda","fdd","ass"));
jcm.forEach((k,v) -> System.out.println(k + "=" + v));

Выход

jar2={classe4=[asda, fdd, ass], classe3=[s, adas, da, sd]}
jar1={classe2=[asda, fdd, ass], classe1=[s, adas, da, sd]}
...