簡體   English   中英

除containsKey以外的其他檢查地圖鍵的方法

[英]Other way to check keys of a Map other than containsKey

我創建了一個返回包含URI參數的Map的方法。 除了map.containsKey(value)之外,還有其他方法可以檢查鍵是否已經在Map中嗎???

 public static Map <String,Object> UriMap(String uri){
    Map <String,Object> map = new HashMap<String,Object>();     
    String [] pathAndQuery = uri.split("\\?",2);    

    if(pathAndQuery.length == 2){//processing starts only if the size of pathAndQuery is 2
        String [] query = pathAndQuery[1].split("\\&");//split the string to array of Strings
        for(String str: query){
            if(str.contains("=")){
                String [] keysAndValues = str.split("\\=",2);                   
                if(map.containsKey(keysAndValues[0])){
                    String oldValue = map.get(keysAndValues[0]).toString();     
                    map.remove(keysAndValues[0]);
                    map.put(keysAndValues[0],Arrays.asList(oldValue, keysAndValues[1]));//for parameters listed twice put a list to value                                       
                }else{                                  
                    map.put(keysAndValues[0],keysAndValues[1]);//put a String to a map
                }
            }else{
                String newParameter = str;
                map.put(newParameter,"");//if "=" symbol is missing I put empty string for value
            }
        }
    }

    return map;
}

您的方法還不錯,但是您忘記了對查詢字符串值進行轉義。 就像是:

String value = URLDecoder.decode(keysAndValues[0], "UTF-8");

因為例如會轉義諸如“?”,“ =”或“&”之類的字符。

您可以在代碼中進行的一種優化是不使用split,而是使用indexOf。 因此,您不會使用split創建數組,但是不會兩次在相同值上循環。

我建議您使用Apache HTTP組件庫 “客戶端”庫具有解析方法 ,該方法接收URI(作為String或URI實例),並向您返回NameValuePairs列表。

方法是

org.apache.http.client.utils.URLEncodedUtils.parse(String s, Charset charset);

要么

org.apache.http.client.utils.URLEncodedUtils.parse(URI uri, String encoding); 

另外,我認為您想先使用Java URI類字符串構造函數將URI字符串轉換為URI實例,因為如果URI格式不正確,則構造函數將拋出URISyntaxException“如果給定的字符串違反RFC 2396,則通過以上偏差”。

我只是意識到沒有人回答您的要求。 這很尷尬,但是隨着時間的流逝,我認為我先前的答案可能會對某人有所幫助,因此我決定重新提出一個答案。

由於您的地圖是HashMap,因此可以確定它是否包含恆定時間O(1)中的鍵,因此我想對您的問題的直接回答是:

是的,還有其他一些簡單的方法來檢查映射中是否已存在某個鍵,例如遍歷keySet並進行比較,但是,您的操作是最佳選擇。

以下是來自Java6HashMap文檔

假設哈希函數將元素正確分散在存儲桶中,則此實現為基本操作(獲取和放置)提供恆定時間的性能。 集合視圖上的迭代所需的時間與HashMap實例的“容量”(存儲桶數)及其大小(鍵-值映射數)成正比。 因此,如果迭代性能很重要,則不要將初始容量設置得過高(或負載因子過低),這一點非常重要。

暫無
暫無

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

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