我想合并两个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);
}
但我想知道,这有多高效?它看起来是正确的,还有更好的方法吗?我不想不必要地使用额外的对象
答案 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());
}
}