合并两个哈希地图Android

时间:2010-10-09 20:06:45

标签: java android optimization performance hashmap

我想合并两个HashMaps。

我可以使用map1.putAll(map2);但是我不想覆盖密钥,因为它们会有冲突的密钥。

因此每张地图中的按键都是这样的

word1     word1
word2     word2
word3     word3

当我合并它们时,我想:

word1
word2
word3
word4
word5
word6

它可以只覆盖密钥,只要密钥是递增的,并使用第一个密钥文本,即读取其中一个对并提取“单词”,因此每个都是word1 word2。

但是另一个警告我正在考虑移动环境以及我可以做什么而不必设置加载屏幕甚至不能。

作为首发,我想:

    HashMap<String, Object> hm1 = new HashMap<String, Object>();
    hm1.put("key1", "a");
    hm1.put("key2", "a");
    hm1.put("key3", "a");
    HashMap<String, Object> hm2 = new HashMap<String, Object>();
    hm2.put("key1", "1");
    hm2.put("key2", "2");
    hm2.put("key3", "3");

    HashMap<String, Object> newHM = new HashMap<String, Object>();      
    String keyWord = "";
    for (String  s: hm1.keySet()) {
        keyWord = s;
        break;
    }
    int count = 0;
    for (Object o : hm1.values()) {
        newHM.put(keyWord+count, o);
    }
    for (Object o : hm2.values()) {
        newHM.put(keyWord+count, o);
    }

但我想知道,这有多高效?它看起来是正确的,还有更好的方法吗?我不想不必要地使用额外的对象

2 个答案:

答案 0 :(得分:2)

如果你的密钥是增量的,基本上代表一个简单的索引,你应该使用List

您可以尝试自己的List实现,它也会存储关键字。

class KeyWordedArrayList<T> extends ArrayList<T>{
    private final String keyword;

    public KeyWordedArrayList(String keyword){
        this.keyword = keyword;
    }

    public String getKeyword(){
        return keyword;
    }
}

您还可以执行Map:

class KeyWordedMap<T> extends HashMap<Integer, T> {
    private final String keyword;

    public KeyWordedMap(String keyword) {
        this.keyword = keyword;
    }

    public String getKeyword() {
        return keyword;
    }

    @Override
    public void putAll(Map<? extends Integer, ? extends T> m) {
        for (Map.Entry<? extends Integer, ? extends T> entry : m.entrySet()) {
            int i = entry.getKey();
            while (this.containsKey(i)) {
                i++;
            }
            this.put(i, entry.getValue());
        }
    }
}

答案 1 :(得分:0)

为了匹配我的例子,它将是:

@Override
public void putAll(Map<? extends String, ? extends Object> m) {
    for (Map.Entry<? extends String, ? extends Object> entry : m.entrySet()) {
        String keyWord = "";
        for (String  s: this.keySet()) {
          keyWord = s.substring(0, s.length()-1);
          break;
        }
        int i = 0;
        while (this.containsKey(i)) {
            i++;
        }
        this.put(keyWord +i, entry.getValue());
    }
}