1

我基本上有一个包含ArrayList<String>,Boolean. 我需要从哈希表中检索密钥。然后我需要从中获取第一个值,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

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

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

4

4 回答 4

2

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

Iterator使用从一组键返回的泛型。

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

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

于 2013-07-09T20:29:09.903 回答
1

你必须在你的Iterator

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

并且对于建议,永远不要使用可变对象作为 Key ,因为您会遇到意外行为。

如果一个对象的 hashCode() 值可以根据它的状态而改变,那么我们在使用这些对象作为基于哈希的集合中的键时必须小心,以确保当它们被用作哈希键时我们不允许它们的状态发生变化. 所有基于散列的集合都假定对象的散列值在用作集合中的键时不会改变。如果键的哈希码在集合中时发生更改,则可能会出现一些不可预测和令人困惑的后果。这在实践中通常不是问题——使用像 List 这样的可变对象作为 HashTable 中的键并不常见

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

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

unmodifiableList用作键。

于 2013-07-09T20:30:20.390 回答
0

使用 aArrayList<String>作为 a 的键Map是一个非常非常糟糕的主意。您绝不能使用可变对象作为键,如果列表更改,键将无效 - 这是一种设计味道(而且很臭)。

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

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

for (ArrayList<String> al : tableRows.keySet()) {
    IDs.add(al.get(0));
}
于 2013-07-09T20:31:56.353 回答
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);
    }

希望这会帮助你。

于 2013-07-09T20:42:58.477 回答