2013-04-11 65 views
4

將Map用作函數參數時,只填充3個鍵的值。但是,當在另一個函數中調用此函數時,用戶將填充初始2個鍵的值,並且不要求爲第3個鍵分配任何值。但是,如果沒有爲第三個鍵分配任何值,則第三個鍵是顯示空值。如何在Java中將HashMap的鍵作爲可選項處理

有什麼辦法可以避免這種情況。如果用戶沒有給第三個鍵分配任何值,它必須是空的而不是空值。

 public String setMapValues(Map<String,String> testMap) throws Exception 
    { 
    String str=""; 

    str= testMap.get("a"); 
    str+=testMap.get("b"); 
    str+=testMap.get("c"); 

    info(str); 

    return str; 
    } 



    public void run() throws Exception 
    { 
    LinkedHashMap<String,String> myMap = new LinkedHashMap<String,String>(); 
    myMap.put("a", "James"); 
    myMap.put("b", "Bond"); 
    this.setMapValues(myMap); 
} 

該函數調用顯示JamesBondnull作爲輸出,而是應該只顯示佔士邦如通過忽略/結尾跳過空的輸出。

+0

然後檢查如果返回值爲null,並且它爲null,則不顯示任何...或使用Hashtable – 2013-04-11 07:51:12

+0

非常感謝Martin和默認語言環境 – Steve 2013-04-11 08:09:43

回答

2

如何:

String temp = testMap.get("c"); 
str+= (temp == null : "" : temp); 
+0

非常感謝Baraky。 – Steve 2013-04-11 08:08:47

3

您可以使用函數像

static String nullAsEmpty(Object o) { 
    return o == null ? "" : o.toString(); 
} 

public String setMapValues(Map<String,String> testMap) { 
    String str = nullAsEmpty(testMap.get("a")) + 
       nullAsEmpty(testMap.get("b")) + 
       nullAsEmpty(testMap.get("c")); 

    info(str); 

    return str; 
} 
+0

非常感謝你Peter – Steve 2013-04-11 08:27:15

1

您可以實現地圖的版本:

import java.util.HashMap; 

class MyMap<K, V> extends HashMap<K, V> { 
    @Override 
    public V get(Object key) { 
     V val = super.get(key); 
     if (val != null) { 
      return val; 
     } else { 
      return ""; 
     } 
    } 
} 

就用MyMap中,而不是地圖

+0

非常感謝你Vadchen – Steve 2013-04-11 08:26:48

1

O [R使用默認值初始化地圖,如果你知道這可能是空

Map getInstance(){ 

    Map<String,String> myMap = new LinkedHashMap<String,String>(); 

    myMap.put("a", ""); 
    myMap.put("b", ""); 
    myMap.put("b", ""); 

    return myMap; 
} 

通過把重複鍵的舊值被新的取代所有的鍵。

+0

非常感謝你Jan Piel – Steve 2013-04-11 08:09:15

+0

我看到它太晚了,但我必須說Vadchens繼承解決方案比我的更好。但是在那裏你可能更好地繼承它,直接用String重寫Value-Generci參數:class MyMap extends HashMap 2013-04-11 08:18:32

1

是完整的:

如果使用Vadchens答案 - 這是更好的 - 你可以做兩件事情:

通過直接設置一般價值參數字符串

class MySecMap<K> extends LinkedHashMap<K, String>{ 
    @Override 
    public String get(Object key) { 
     String val = super.get(key); 
     if (val != null) { 
      return val; 
     } else { 
      return ""; 
     } 
    } 
} 
擴展地圖

或者創建一個帶額外接口和默認值提供者的類:

interface IDefaultValueProvider<V>{ 
    V getDefaultValue(); 
} 

class MyMap<K, V, D extends IDefaultValueProvider<V>> extends LinkedHashMap<K, V>{ 

    private IDefaultValueProvider<V> provider; 

    public MyMap(IDefaultValueProvider<V> p){ 
     super(); 
     provider = p; 
    } 

    @Override 
    public V get(Object key) { 
     V val = super.get(key); 
     if (val != null) { 
      return val; 
     } else { 
      return this.provider.getDefaultValue(); 
     } 
    } 
}