请教一个从Collection到Map保持排序顺序不变的问题

02-10-21 wys1978
一个简单的类

public class Foo {

String valueA;

String valueB;

}

有3个这样的对象按照以下的顺序存在一个Collection c里:

foo1: valueA = "kick"; valueB = "me";

foo2: valueA = "kiss"; valueB = "you";

foo3: valueA = "kill"; valueB = "he";

然后想生成一个Map m,m的key为foon的valueA,对应的value为foon的valueB

做法如下:

Map m = new HashMap();

Iterator i = collection.iterator();

while(i.hasNext()){

Foo element = (Foo)i.next();

m.put(element.valueA,element.valueB);

}

当用Map的keySet方法遍历所有的元素时候,出来的顺序已经和原来的Collection不一样了,如果额外多加一个List来记录key,是可以解决,但是总觉得Java的架构里应该有更简单的方法可以实现这样的效果.

请大家帮忙,谢谢了!

why10k
2002-10-23 16:25
参考;你可以自己实现一个map,提供按存入顺序遍历元素的方法.

wys1978
2002-10-24 18:53
good idea,以下是实现的代码,希望有人碰到这样的问题也可以用

public class OrderedMap extends HashMap {

    private List orderedKeys = new LinkedList();

    /**
     * @see java.util.Map#keySet()
     */   
    public Set keySet() {
        return new OrderedSet(orderedKeys);
    }
 
    /**
     * @see java.util.Map#put(java.lang.Object, java.lang.Object)
     */
    public Object put(Object key, Object value) {
        if (!orderedKeys.contains(key))
            orderedKeys.add(key);
        return super.put(key, value);
    }

    /**
     * @see java.util.Map#clear()
     */   
    public void clear() {
        super.clear();
        orderedKeys.clear();
    }
   
    /**
     * @see java.util.Map#remove(java.lang.Object)
     */
    public Object remove(Object key) {
        if (orderedKeys.contains(key))
            orderedKeys.remove(key);
        return super.remove(key);
    }
}
<p>

chenchanchina
2010-10-21 10:47
笨,java自带的LinkedHashMap就干这活

猜你喜欢