我在这里看一个java刽子手游戏:https://github.com/leleah/EvilHangman/blob/master/EvilHangman.java
代码特别是:
Iterator<Entry<List<Integer>, Set<String>>> k = partitions.entrySet().iterator();
while (k.hasNext())
{
Entry<?, ?> pair = (Entry<?, ?>)k.next();
int sizeOfSet = ((Set<String>)pair.getValue()).size();
if (sizeOfSet > biggestPartitionSize)
{
biggestPartitionSize = sizeOfSet;
}
}
现在我的问题。我的google foo很弱我猜,除了java doc本身之外,我在条目集上找不到太多东西。这只是地图的临时副本吗?我在语法上找不到任何信息:
Entry<?, ?>
有人可以解释或指出我对这些问号发生了什么的解释吗? 谢谢你提前。
答案 0 :(得分:3)
entrySet
是地图中所有条目的集合 - 即地图中所有键,值对的集合。因为Map由键值对组成,如果要迭代它,则需要指定是否要迭代键,值或两者(条目)。
<?,?>
表示pair
变量包含一个条目,其中键和值可以是任何类型。这通常表明我们不关心它拥有什么类型的价值观。在您的代码中情况并非如此,因为您需要将值强制转换为Set<String>
,以便检查其大小。
您还可以按如下方式重写代码,避免转换为Set<String>
Iterator<Entry<List<Integer>, Set<String>>> k = partitions.entrySet().iterator();
while (k.hasNext())
{
Entry<?, Set<String>> pair = (Entry<?, Set<String>>)k.next();
int sizeOfSet = pair.getValue().size();
if (sizeOfSet > biggestPartitionSize)
{
biggestPartitionSize = sizeOfSet;
}
当我们需要更具体地说明条目所包含的类型时,我们可以使用完整类型:Entry<List<Integer>, Set<String>>
。这样就无需将键或值强制转换为特定类型(以及转换为错误类型的风险)。
您也可以只指定键的类型或值,如上例所示。
答案 1 :(得分:1)
您可以在Javadoc中找到有关Entry的信息: http://docs.oracle.com/javase/7/docs/api/java/util/Map.Entry.html
<?, ?>
部分是因为Entry是通用接口。
此处?
的更多信息:http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
话虽如此,这个例子中的用法并不是很好。获取sizeOfSet的更简洁方法:
int sizeOfSet = k.next().getValue().size();
答案 2 :(得分:0)
你不应该对entrySet()函数返回有太多了解。您可以依赖的只是Set<Map.Entry<x,y>>
。它可能是一个相当特殊的(*)副本,但它更可能是一个提供原始Map
内部视图的对象。
在现代Java中,这种事情通常写成:
for (Map.Entry<X, Y> me : map.entrySet()) {
// code that looks at me.xxx() here
}
在您的示例中,X,Y为List<Integer>, Set<String>
。
(*)文档说,'该集由地图支持,因此对地图的更改将反映在集中,反之亦然。'
感谢@Miserable Variable。
答案 3 :(得分:0)
Entry<?, ?>
有人可以解释或指出我对这些问号发生了什么的解释吗?
我可能错了,但我认为程序员试图变得懒惰。应该是
Entry<List<Integer>, Set<String>>>
然后不需要任何演员阵容
ALSO:
我的google foo很弱我猜,除了java doc本身之外,我在条目集上找不到太多东西。这只是地图的临时副本吗?
Javadoc拥有您需要的一切(强调我的):
您还在寻找更多信息吗?