首页 > 代码库 > Map.Entry

Map.Entry

实例如下:

public String getReportURL() throws Exception {
        String reportURL = parameterMap.get("showPageUrl").toString() + "showPageNum=1";
        Iterator it = parameterMap.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry) it.next();
            Object keyObj = entry.getKey();
            Object valObj = entry.getValue();
            if (keyObj != null && keyObj.toString().length() > 0 && valObj != null && valObj.toString().length() > 0) {
                String key = keyObj.toString();
                String val = valObj.toString();
                if (!"showPageNum".equals(key))
                    reportURL += "&" + URLEncoder.encode(key, "gb2312") + "=" + URLEncoder.encode(val, "gb2312");
            }
        }
        return reportURL;
    }

 

 Map类提供了一个称为entrySet()的方法,这个方法返回一个Map.Entry实例化后的对象集。 接着,Map.Entry类提供了一个getKey()方法和一个getValue()方法

 

同时,提供给开发人员一个同时保持了关键字和其对应的值的类。Map.Entry同时也提供了一个setValue()方法,程序员可以使用它修改map里面的值。

map内部是按照hash算法存储的,但如果能对map排序在某些时候还是有用的

/**
     * @param h
     * @return
     * 实现对map按照value升序排序
     */
    @SuppressWarnings("unchecked")
    public static Map.Entry[] getSortedHashtableByValue(Map h) {
        Set set = h.entrySet();
        Map.Entry[] entries = (Map.Entry[]) set.toArray(new Map.Entry[set .size()]);
        Arrays.sort(entries, new Comparator() {
            public int compare(Object arg0, Object arg1) {
                Long key1 = Long.valueOf(((Map.Entry) arg0).getValue().toString());
                Long key2 = Long.valueOf(((Map.Entry) arg1).getValue().toString());
                return key1.compareTo(key2);
            }
        });

        return entries;
    }

/**
     * @param h
     * @return
     * 实现对map按照key排序
     */
    @SuppressWarnings("unchecked")
    public static Map.Entry[] getSortedHashtableByKey(Map h) {

        Set set = h.entrySet();

        Map.Entry[] entries = (Map.Entry[]) set.toArray(new Map.Entry[set.size()]);

        Arrays.sort(entries, new Comparator() {
            public int compare(Object arg0, Object arg1) {
                Object key1 = ((Map.Entry) arg0).getKey();
                Object key2 = ((Map.Entry) arg1).getKey();
                return ((Comparable) key1).compareTo(key2);
            }

        });

        return entries;
    }

 

 

 

Map的keySet方法

2008-07-12 10:44

 

有一个Map对象,这时候使用keySet()方法获取所有的key值,比如:

   Map map = new HashMap();

   map.put(1, "a");

   map.put(2, "b");

   map.put(3, "c");

   map.put(4, "d");

   Set keys1 = map.keySet();

   Set keys2 = map.keySet();

   Set keys3 = map.keySet();

上面三个set对象key1,key2,key3引用的是一个对象。这是map的keySet()方法只返回一个set实例,所以当从key1中删除一个对象时候,key2和key3将会受到影响。

   keys1.remove(1);

   System.out.println(keys1);

   System.out.println(keys2);

   System.out.println(keys3);

打印结果为:

[2, 4, 3]

[2, 4, 3]

[2, 4, 3]

 

在使用map时有时会出现此类的错误

    java.util.ConcurrentModificationException 

 

在执行如下 代码时会出此错误:

  Set<String> keySet=map.keySet();

for(String key:keySet){

    map.remove(key);

}

原因是删除一个Entry之后keySet集合不对,在执行循环时会出现错误。将代码改为如下则能解决此问题:

String[]  keySet=map.keySet().toArray(new String[0])

for(String key:keySet){

    map.remove(key);

}

 

因为加了toArray所以新的集合和原来的keySet就没有了关系,所以也就不会出错了