【问题标题】:How do I retrieve a key of ArrayList<String> from a Hashtable?如何从哈希表中检索 ArrayList<String> 的键?
【发布时间】:2013-07-07 14:36:00
【问题描述】:

我基本上有一个包含ArrayList&lt;String&gt;,Boolean 的哈希表。我需要从哈希表中检索密钥。然后我需要从ArrayList&lt;String&gt; 中获取第一个值,这是关键。

我试过了:

    Hashtable<ArrayList<String>,Boolean> tableRows = tableRead(); // returns the Hashtable.

    ArrayList<String> IDs = new ArrayList<String>();        

    Iterator it = tableRows.keySet().iterator();
    while (it.hasNext()) {
        IDs.add(it.next().get(0));      
    }

但是,这给了我一个错误:cannot find symbol

[javac]   symbol:   method get(int)
[javac]   location: class Object

只是给出一个功能性的想法:我基本上将整个 DB 行作为 Hashtable 中的键。我只需要取回 ID。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 哪个符号找不到?
  • 你的 hashTable 定义如何?
  • 在您的迭代器声明中为您想要的类型添加一个通用参数,即。 Iterator&lt;ArrayList&lt;String&gt;&gt;.
  • 好吧,你在 Object 上调用 get,这是编译错误的来源。
  • @gran_profaci 最好只使用 id 作为键,而不是整行。看我的回答。

标签: java arraylist iterator key hashtable


【解决方案1】:

您已经声明了一个原始的Iterator,因此它的next() 方法将返回一个Object,它没有get 方法。这是您的密钥,但它的类型为 Object,因为您的 Iterator 是原始的(没有泛型类型参数)。

使用从键集返回的通用Iterator

Iterator<ArrayList<String>> it = tableRows.keySet().iterator();

然后it.next() 将返回一个ArrayList&lt;String&gt;,您可以在其上调用get

【讨论】:

    【解决方案2】:

    您必须在 Iterator 中使用原始类型

    Iterator&lt;ArrayList&lt;String&gt;&gt; it = tableRows.keySet().iterator();

    建议不要使用可变对象作为关键,因为您会出现意外行为。

    如果一个对象的 hashCode() 值可以根据它的状态而改变,那么我们 使用这些对象作为基于哈希的键时必须小心 集合以确保我们不允许它们的状态在何时更改 它们被用作哈希键。所有基于哈希的集合都假设 一个对象的哈希值在它被用作一个对象时不会改变 集合中的关键。如果一个键的哈希码在它发生变化时 在一个集合中,一些不可预测和令人困惑的后果 可以跟随。这在实践中通常不是问题 - 不是 使用可变对象(如 List)作为 a 中的键的常见做法 哈希表

    如果您仍然希望通过这种方式使 String 集合不可修改。

    List&lt;String&gt; unmodifiableList = Collections.unmodifiableList(myKeyList);

    并使用unmodifiableList 作为键。

    【讨论】:

      【解决方案3】:

      试试这个

          ArrayList<String> list = new ArrayList<>();
          Hashtable<ArrayList<String>,Boolean> tableRows = new Hashtable<>();
          Set<ArrayList<String>> keys  = tableRows.keySet();
          Iterator<ArrayList<String>> itr = keys.iterator();
          while(itr.hasNext()){
              itr.next().get(0);
          }
      

      希望这会对你有所帮助。

      【讨论】:

        【解决方案4】:

        使用ArrayList&lt;String&gt; 作为Map 的密钥是一个非常非常糟糕的主意。你绝不能使用可变对象作为键,如果列表发生任何变化,键将无效 - 这是一种设计味道(而且很臭)。

        作为替代方案,我建议您使用ArrayList 中的字符串连接构建一个不可变键,或者使用使用Collections.unmodifiableList() 创建的不可变列表,甚至更好,只使用id 列,将整行用作键没有任何意义。

        无论如何,如果您必须使用 ArrayList 作为键,下面的代码将解决问题 - 并且无需显式使用迭代器,增强的 for 循环非常重要在这种情况下迭代键的更好选择:

        for (ArrayList<String> al : tableRows.keySet()) {
            IDs.add(al.get(0));
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-02
          • 2013-02-12
          • 1970-01-01
          • 2016-02-24
          • 1970-01-01
          • 2014-02-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多