如何从Hashtable中检索ArrayList <string>的键?</string>

时间:2013-07-09 20:25:33

标签: java arraylist iterator key hashtable

我基本上有一个包含ArrayList<String>,Boolean的HashTable。我需要从Hashtable中检索密钥。然后我需要从ArrayList<String>得到第一个值,这是关键。

我试过了:

    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

只是给出一个功能性的想法:我基本上有一个完整的数据库行作为Hashtable中的一个键。我只需要取回身份证。

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

4 个答案:

答案 0 :(得分:2)

您已声明原始Iterator,因此其next()方法将返回Object,其中没有get方法。它是您的密钥,但它被键入Object,因为您的Iterator是原始的(没有泛型类型参数)。

使用从密钥集返回的通用Iterator

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

然后it.next()将返回ArrayList<String>,您可以在其上调用get

答案 1 :(得分:1)

您必须在Iterator

中使用原始类型

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

对于推荐,永远不要使用可变对象作为键,因为你会有意想不到的行为。

  

如果对象的hashCode()值可以根据其状态改变,那么我们   在基于哈希的键中使用此类对象时必须小心   集合,以确保我们不允许他们的状态改变时   它们被用作哈希键。所有基于散列的集合都假定   对象的哈希值在使用时不会改变   集合中的关键。如果密钥的哈希码在其中发生变化   是一个集合,一些不可预测和混乱的后果   可以跟着。这在实践中通常不是问题 - 不是   通常的做法是使用像List这样的可变对象作为关键字   哈希表

如果你仍然希望以这种方式使String集合不可修改。

List<String> unmodifiableList = Collections.unmodifiableList(myKeyList);

并使用unmodifiableList作为密钥。

答案 2 :(得分:0)

使用ArrayList<String>作为Map的关键是一个非常非常糟糕的主意。你绝对不能使用可变对象作为密钥,如果列表发生任何变化,密钥将无效 - 这是一种设计气味(和臭味的)。

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

无论如何,如果您必须使用id作为键,以下代码将解决问题 - 并且不需要显式使用迭代器,增强型ArrayList在这种情况下,循环是迭代密钥的更好的选择:

for

答案 3 :(得分:0)

试试这个

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

希望这会对你有所帮助。