簡體   English   中英

擴展HashMap的java類<String, Map <String, List<String> &gt; 覆蓋方法放置不起作用

[英]java class that extend HashMap <String, Map <String, List<String> > overwrite method put dont work

嗨,我的課有一個問題:

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],
        }
}

謝謝 問候

如果您為現有鍵添加新值,則Map覆蓋先前的值。 檢查文檔,其中指出:

如果映射先前包含鍵的映射,則舊值將替換為指定值。

如果您總是使用相同的鍵調用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]}}

put方法更換內部地圖給定的jar關鍵,所以只有最后classe對於給定的jar密鑰將被保留。 jar鍵還沒HashMap ,您應該只放置一個新的內部HashMap

方法實現應該是:

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]}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM