2

我想从中删除元素HashTable,我用hashTable.remove()这个但没有得到

Hashtable<Integer,String> players = new Hashtable<Integer,String>();

        players.put(1, "Sachin Tendulkar");
        players.put(2, "Rahul Dravid");
        players.put(3, "Virat Kohli");
        players.put(4, "Rohit Sharma");

        Enumeration<String> enumration = players.elements();

        while(enumration.hasMoreElements()){
            String elmnt = enumration.nextElement();
            System.out.println(elmnt);
            if(elmnt.startsWith("R")){
                players.remove(elmnt);
                System.out.println(elmnt+"::Contains R");
            }

        }

        System.out.println(players);

我得到的输出是:

Rohit Sharma
Rohit Sharma::Contains R
Virat Kohli
Rahul Dravid
Rahul Dravid::Contains R
Sachin Tendulkar
{4=Rohit Sharma, 3=Virat Kohli, 2=Rahul Dravid, 1=Sachin Tendulkar}
4

8 回答 8

3

那是因为您试图删除该值,但该remove()方法需要一个键。

当您打电话时,player.elements()您会得到values的枚举,而不是键的枚举。该remove()方法适用于键,而不是值。

来自HashTable remove() 文档

public V remove(Object key):从此哈希表中删除键(及其对应的值)。如果键不在哈希表中,则此方法不执行任何操作。

此外,从同一个文档中,这里简要解释了为什么使用删除元素不是一个好主意:Enumeration

因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。Hashtable 的键和元素方法返回的枚举不是快速失败的。

我建议您做的是遍历条目,而不是值。

for (Entry<Integer, String> entry: players.entrySet()){
        String value = entry.getValue();
        System.out.println(value);
        if(value.startsWith("R")){
            players.remove(entry.getKey());
            System.out.println(value+"::Contains R");
        }
}

这样,您在每次迭代中都有键和值。您可以检查value(这是玩家的名字),然后使用key来操作您的桌子。

于 2013-10-30T06:43:45.387 回答
1

请添加keyremove()方法而不是value.

    Hashtable<String, Integer> h = new Hashtable<String, Integer>();
    h.put("n1", 30);
    h.put("n2", 30);
    h.remove("n1"); //here we are giving "n1" which is key of the hashTable 
于 2013-10-30T06:44:47.870 回答
1
    for(Iterator<Map.Entry<Integer, String>> iter =  players.entrySet().iterator(); iter.hasNext(); ) {
        Map.Entry<Integer, String> e = iter.next();
        if(e.getValue().startsWith("R")) {
            iter.remove();
        }
    }
于 2013-10-30T06:45:28.343 回答
1

您需要key作为参数传入以hashTable.remove()从中删除HashTable

参考:从哈希表中删除

从哈希表中删除条目的最佳方法。 这可能对你有帮助,看看它。

于 2013-10-30T06:48:45.927 回答
1

不要从枚举中删除。

Java文档

“因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。Hashtable 的键和元素方法返回的枚举不是快速失败的。”

您应该使用迭代器

import java.util.Hashtable;
import java.util.Iterator;


public class Test {
    public static void main(String[] args) {
        Hashtable<Integer,String> players = new Hashtable<Integer,String>();

        players.put(1, "Sachin Tendulkar");
        players.put(2, "Rahul Dravid");
        players.put(3, "Virat Kohli");
        players.put(4, "Rohit Sharma");

       Iterator<Integer> iterators = players.keySet().iterator();
       while(iterators.hasNext()) {
           int key = iterators.next();
           if(players.get(key).startsWith("R")) {
               iterators.remove();
           }
       }

        System.out.println(players);
    }
}
于 2013-10-30T06:49:20.317 回答
0

players.remove(elmnt);方法尝试删除elmt键的条目。但是您通过value了 ofHashtable而不是key.

于 2013-10-30T06:45:32.503 回答
0

用于players.keySet()获取钥匙代替players.elements().

于 2013-10-30T06:50:15.023 回答
0

这是从哈希表中删除元素的编码语法:-

公共虚拟无效删除(对象键)

可以使用 hash ref 和 hash remove 操作相互哈希表。由多个线程并发,并且操作根据需要由特定于表的信号量保护。鉴于,删除记录不得妨碍以后的搜索。换句话说,搜索过程仍然必须通过新空槽才能到达其探测序列通过该槽的记录。

于 2013-10-30T06:57:29.503 回答