【问题标题】:Remove an Element From HashTable?从哈希表中删除一个元素?
【发布时间】:2013-11-09 15:02:26
【问题描述】:

我想从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}

【问题讨论】:

  • 为什么不使用迭代器并使用 remove() 使用它?
  • 您正在使用 player.elements() 获取值,然后尝试使用值而不是键从哈希表中删除元素。

标签: java hashtable


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    来自HashTable remove() documentation

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

    另外,来自同一个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来操纵你的桌子。

    【讨论】:

      【解决方案3】:

      请将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 
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          不要从枚举中删除。

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

          【讨论】:

            【解决方案6】:

            您需要将key 作为参数传递给hashTable.remove() 才能从HashTable 中删除。

            参考:Remove from HashTable

            Best way to remove an entry from a hash table. 这可能对你有帮助,看看吧。

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:
                    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();
                        }
                    }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-12-13
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-03-27
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多