【问题标题】:Iterating through hashtable and using the get and containsKey methods遍历哈希表并使用 get 和 containsKey 方法
【发布时间】:2014-12-22 08:41:18
【问题描述】:

containsKey 和 get 方法有问题,也不确定如何遍历哈希表键和值,我想遍历并将值为 true 的键添加到解决方案列表中

第一个错误:未定义 hashTable 类型的方法 containsKey(int)

第二个错误:只能遍历数组或 java.lang.Iterable 的实例

第三个错误:方法 get(int) 未定义类型 hashTable

  package practice;

        import java.util.*;
        /*

        You are given an integer array, where all numbers except for TWO numbers appear even number of times. 

        Q: Find out the two numbers which appear odd number of times.

        */

        public class hashTable{
        public static void main(String[] args){
            int[] test = {2, 2, 5, 7, 4, 4};
            List<Integer> solution = new ArrayList<Integer>();
            Hashtable<Integer, Boolean> ht = new Hashtable<Integer, Boolean>(); 
            Boolean check = true;
            for (int item : test){
//error             if (!containsKey(item)){
                    check = true;
                } else{
                    check = false;
                    ht.put(item, check);

                }
                }

//error            for (int item : ht){
//error             if (get(item) == true){
                    solution.add(item);
                }
                }
            System.out.println("the result is");
            System.out.println(solution);
            }

         }

【问题讨论】:

  • Hashtable ht = new Hashtable(); 更改为Hashtable&lt;Integer, String&gt; ht = new Hashtable&lt;Integer, String&gt;();
  • 如果你的输入数组总是排序的,就像你的代码一样,你不需要哈希表。您可以通过对输入数组的单次迭代来计算每个整数的出现次数。
  • 您使用哈希表有什么特别的原因吗? AFAIR,它已被弃用。改用 HashMap。
  • 不,它没有被弃用。自 Java 1.0 以来,大学还没有升级他们的课程,所以这就是他们仍然教授的内容。
  • 好的,哈希表现在可以工作了,我如何进行链接以及如何获取哈希表中的链数?我在文档中找不到它

标签: java hashtable chaining


【解决方案1】:

问题似乎是您使用的是泛型类型而不提供泛型信息。如果你输入@SuppressWarnings("unchecked")(或类似的东西,没有要测试的IDE),警告应该消失。话虽如此,我建议不要这样做。

理想情况下,您应该提供通用信息并按照@BackSlash 的建议进行操作:Hashtable&lt;Integer, String&gt; ht = new Hashtable&lt;Integer, String&gt;();。这将为编译器提供所需的通用信息,并使您的集合类型安全,这是您通常想要的。

话虽如此,我会推荐一种不同的方法:

  1. 遍历您的数组。
  2. 创建哈希表:HashTable&lt;Integer, Boolean&gt;
  3. 如果您要迭代的数字存在于哈希表中,则对 HashTable[number] 处的值应用 not 运算符。
  4. 如果不是,请添加一个新条目并将布尔值设置为 false。

看到你的评论,你可以试试这样:

Hashtable<Integer, Boolean>  table = new Hashtable<Integer, Boolean>();
int[] nums = ...
for(Integer number : nums)
{
    if(table.containsKey(number))
    {
        table.put(number, !table.get(number));
    }
    else
    {
        table.put(number, false);
    }
}

【讨论】:

  • 问题是如果数字出现 3 次,那么它应该被返回,但在这种情况下它不会是
  • @FullCombatBeard:x 第一次出现时,您将拥有[x, false]。第二次出现时,您将拥有[x, true]。第三次出现时,您将获得[x, false]。当您最后浏览哈希表时,它会指出x 出现的时间不均数,据我所知,这就是您所追求的。
  • 我试图实现你所说的,但我在使用哈希表的方法时遇到了一些问题
  • @FullCombatBeard:我尝试添加一些代码。看看有没有帮助。
猜你喜欢
  • 2014-01-21
  • 1970-01-01
  • 2014-06-01
  • 2012-04-21
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
相关资源
最近更新 更多