从HashTable中删除元素?

时间:2013-10-30 06:39:40

标签: java hashtable

我想删除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}

8 个答案:

答案 0 :(得分:3)

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

当您致电player.elements()时,您会获得的枚举,而不是密钥。 remove()方法适用于键,而不是值。

来自HashTable remove() documentation

  

公开V删除(对象键):   从此哈希表中删除键(及其对应的值)。如果密钥不在哈希表中,则此方法不执行任何操作。

另外,从同一个documentation开始,这里有一个简短的解释,说明为什么使用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来操纵您的桌子。

答案 1 :(得分:1)

请将key添加到remove()方法,而不是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 

答案 2 :(得分: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();
        }
    }

答案 3 :(得分:1)

您需要在key中将hashTable.remove()作为参数传递给HashTable

参考:Remove from HashTable

Best way to remove an entry from a hash table. 这可能对您有所帮助,请看一下。

答案 4 :(得分:1)

请勿从枚举中删除。

Javadocs

  

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

您应该使用iterator

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

使用players.keySet()获取密钥以代替players.elements()

答案 7 :(得分:0)

以下是用于从哈希表中删除元素的编码语法: -

public virtual void删除(     对象键 )

可以使用散列引用和散列删除来操纵相互散列表。同时由多个线程和操作根据需要由特定于表的信号量保护。 然而,删除记录不得妨碍以后的搜索。换句话说,搜索过程仍然必须通过新清空的插槽才能到达探测序列通过此插槽的记录。