0

我创建了一个返回包含 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;
}
4

3 回答 3

0

您的方法还不错,但是您忘记了对查询字符串值进行转义。就像是:

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

因为例如像“?”、“=”或“&”这样的字符会被转义。

您可以在代码中进行的一项优化是不使用 split,而是使用 indexOf。因此,您不会使用 split 创建数组,但您不会两次循环使用相同的值。

于 2012-07-11T07:41:55.990 回答
0

我才意识到没有人回答你的要求。这很尴尬,但是我认为我以前的答案可能会随着时间的推移对某人有所帮助,所以我决定提出一个新的答案。

由于您的 Map 是一个 HashMap,它能够判断它是否在恒定时间 O(1) 中包含一个键,所以我想您的问题的直接答案是:

是的,还有其他简单的方法来检查一个键是否已经在你的地图中,比如遍历 keySet 并进行比较,但是你正在做的是最好的选择。

以下来自Java6 的 HashMap 文档

此实现为基本操作(get 和 put)提供恒定时间性能,假设哈希函数将元素正确地分散在桶中。集合视图的迭代需要的时间与 HashMap 实例的“容量”(桶的数量)加上它的大小(键值映射的数量)成正比。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子太低),这一点非常重要。

于 2012-07-11T08:36:19.570 回答
0

我建议您使用Apache HTTP 组件库。“客户端”库有一个解析方法,它接收一个 URI(作为一个字符串或一个 URI 实例)并返回一个 NameValuePair 列表。

方法是

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,由以上偏差”。

于 2012-07-11T07:42:19.057 回答