2010-10-09 75 views
3

我想合并两个哈希映射。合并两个哈希映射Android

我可以使用map1.putAll(MAP2);但我不想重写密钥,因为他们会有冲突的密钥。

所以在每个地图的钥匙会是这样

word1  word1 
word2  word2 
word3  word3 

,当我将它们合并,我想:

word1 
word2 
word3 
word4 
word5 
word6 

它可以只覆盖键,aslong的关键是增量并使用第一个关键文本,即读取其中一对并提取“单词”,这样每个单词都将是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); 
    } 

但我想知道,如何高效这是什么?它看起来是正确的,有没有更好的方法来做到这一点?我不想不必要地使用额外对象

+1

字符串关键字= “”; (String s:hm1.keySet()){ keyWord = s; 休息; } 这样做有什么意义呢?它总是会设置关键字来HM1 – 2010-10-09 20:10:12

+1

第一密钥的理念是,要检索已创建地图的一个关键,我忘了,虽然从中取出数,所以每个按键会key11,KEY12,kat13。所以我应该用一个子串来解决这个问题。只要查看列表回答第一tho – Blundell 2010-10-09 21:26:39

回答

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; 
    } 
} 

你也可以做地图的实现:

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

这是一个有效的点,但是在一些情况下,当我实例化这个hashmap对象的键不是增量的,所以我想哈希映射对象在这两种情况下工作。 (我不会在这种情况下调用合并方法)。 我可以把它分成两个独立的对象,但我不认为这应该是我的解决方案。 – Blundell 2010-10-09 21:43:02

+0

@Blundell,用Map实现更新。 – 2010-10-09 21:53:17

+0

很酷我得到了这个感谢 - 我想你认为这是最佳答案呢?它采用了至少新对象等再次回答了这个问题,因此任何人在看我的Q能够看到答案 – Blundell 2010-10-09 22:57:36

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()); 
    } 
}