2017-03-10 104 views
4

我想擴展HashMap添加方法putIfGreaterThan,它基本上檢索給定鍵的值,如果新值大於舊值,我們用新值更新舊值。就像這樣:同時擴展HashMap和LinkedHashMap?

public void putIfGreaterThan(String key, Double value) 
    { 

    if (containsKey(key) != true) { 
    put(key , value); 
    } else { 
    if (get(key) < value) { 
    System. out .println("Adding new value: " + value + " to map"); 
    put(key , value); 
    } else { 
    System. out .println("Did not add value: " + value + " to map"); 
    } 
    } 


    } 

上面的程序工作正常 - 但我想這種方法添加到這兩個HashMapLinkedHashMap。換句話說,如果有人實例:

HashMap hashmap = new HashMap(); 

他們應該能夠訪問方法:

hashmap.putIfGreaterThan(); 

如果有人實例:

LinkedHashMap linkedhashmap = new LinkedHashMap(); 

他們應該能夠訪問方法:

linkedhashmap .putIfGreaterThan(); 

如果我創建一個新的類,如下所示:

MyHashMap extends HashMap<String, Double>並添加前面提到的方法 - 我只是延長HashMapLinkedHashMap。如果我實例化LinkedHashMap,這將不允許我訪問該方法。

我想修改原始HashMap類中的源代碼(通過添加方法putIfGreaterThan),但是我無法修改源代碼,除非我解編整個類(並且當我嘗試這樣做時,我得到一堆其他的錯誤,所以我認爲只是擴大HashMap類,但這樣做意味着我不能在HashMapLinkedHashMap)上使用方法putIfGreaterThan

此外,如果我已經將方法添加到原始類中,則可以在任何HashMap(即使該映射包含兩個字符串)上調用此方法,但該方法僅適用於包含String和Double的HashMap或者String和Int。因此,我認爲擴展原始類並使用與String和Double的HashMap相關的方法定製當前類更有意義。

有什麼建議嗎?

謝謝

+2

我建議使用成分。讓你的班級有一個hashmap,然後用你的邏輯包裝地圖的put方法。 – chatton

+0

無法完成修改HashMap類本身的行爲,而不僅僅是您自己的自定義類,出於充分的理由:它會爲各地的Java應用程序引入安全噩夢。 – VGR

+0

爲什麼冗餘'if(containsKey(key)!= true)'而不是直接的if(!containsKey(key))'? –

回答

2

讓您的自定義地圖實現Map接口代替,敷用它具體的地圖是由類的用戶通過構造函數提供:

public class MyMap implements Map<String, Double>{ 
    private final Map<String, Double> map; 

    public MyMap(Map<String, Double> map){ 
     this.map = map; 
    } 

    public void putIfGreaterThan(String key, Double value){...} 

    @Override 
    public int size() { 
     return map.size(); 
    } 

    //inherited methods 
} 

這個類可以這樣使用:

MyMap map = new MyMap(new LinkedHashMap<>()); 

或:

MyMap map = new MyMap(new HashMap<>()); 
+0

你不應該在這裏使用'putIfGreaterThan(K鍵,V值)'嗎? – NAMS

+0

@NAMS是的,謝謝 - 修復它。 – Calculator

+0

如果我實現了Map接口,我不得不添加12個未實現的方法,如size(),containsKey()和isEmpty()。我現在需要爲每個方法添加正文。看起來像很多額外的工作,只是定義1個新方法.. –

0

你不能你的方法添加到現有的HashMap或者LinkedHashMap類。 唯一的方法是創建一個自定義類MyHashMap<K,V>,該類實現Map接口並將您的邏輯組合到那裏,並與HashMap和(或)LinkedHashMap組成類,讓您的客戶在MyHashMap上運行。