0

假设我有以下两个结构:

ArrayList<String> test =new ArrayList<String>();
HashTable <ArrayList<String>, Integer> h1 = new Hashtable<Arraylist<String>, Integer>();
HashTable <ArrayList<String>, Integer> h2 = new Hashtable<Arraylist<String>, Integer>();

我可以检查 h1 是否包含 h2 中存在的键(基本上是一个 Arraylist),然后替换其中的 int 值,如下所示:

for (Hashtable <ArrayList<String>, Integer> entry : h2.entrySet()) {
    if(h1.containsKey(entry.getKey()))
    entry.replace(entry.getKey(), 1);
}

或者做:

for (Hashtable <ArrayList<String>, int> entry : h2.entrySet()) {
    if(h1.containsKey(entry.getKey()))
    h2.put(entry.getKey(),1);
}

?? 请帮帮我...

4

3 回答 3

0

除了编译错误,您的最后一个代码块应该完全符合您的要求。

ArrayList<String> test = new ArrayList<String>();
Hashtable <ArrayList<String>, Integer> h1 = new Hashtable <ArrayList<String>, Integer>();
Hashtable <ArrayList<String>, Integer> h2 = new Hashtable <ArrayList<String>, Integer>();
for (ArrayList<String> key : h2.keySet()) {
    if(h1.containsKey(key))
        h2.put(key, 1);
}
于 2013-07-03T08:38:35.787 回答
0

是的,你可以做到。因为contains()内部首先hashCode()要找出哈希桶。然后使用传递的搜索对象对哈希桶中的equals()每个进行处理。key

  • equals()ArrayList在(通过AbstractList)中被覆盖

Javadoc 说

这个实现首先检查指定的对象是否是这个列表。如果是,则返回 true;如果不是,它检查指定的对象是否是一个列表。如果不是,则返回 false;如果是这样,它会遍历两个列表,比较相应的元素对。如果任何比较返回 false,则此方法返回 false。如果其中一个迭代器在另一个迭代器之前用完元素,则返回 false(因为列表的长度不等);否则在迭代完成时返回 true。

换句话说,如果 2 个列表包含相同序列中的相同元素,则它们是 eqaul。

  • 如果两个ArrayList有相同的元素,它们hashCode()应该是相同的
于 2013-07-03T08:43:07.047 回答
0

这是一件非常有趣的事情,正如人们已经说过的那样,您应该认真考虑您对数据类型的使用。但这应该可以解决问题。

Hashtable<ArrayList<String>, Integer> h3 = (Hashtable<ArrayList<String>, Integer>) h2.clone();

for(ArrayList<String> a: h2.keySet()){
    if(h1.containsKey(a)){
        h3.put(a, 1);
    }
}
h2 = h3;
于 2013-07-03T08:48:09.700 回答