![](/img/trans.png)
[英]Effective way of replacing containsKey check with methods introduced in java8 for Map
[英]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並進行比較,但是,您的操作是最佳選擇。
假設哈希函數將元素正確分散在存儲桶中,則此實現為基本操作(獲取和放置)提供恆定時間的性能。 集合視圖上的迭代所需的時間與HashMap實例的“容量”(存儲桶數)及其大小(鍵-值映射數)成正比。 因此,如果迭代性能很重要,則不要將初始容量設置得過高(或負載因子過低),這一點非常重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.