我基本上有一个包含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中的一个键。我只需要取回身份证。
有人可以帮我解决这个问题吗?
答案 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);
}
希望这会对你有所帮助。