无法理解Java map Entry集

时间:2012-10-19 22:48:14

标签: java dictionary iteration

我在这里看一个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<?, ?>

有人可以解释或指出我对这些问号发生了什么的解释吗? 谢谢你提前。

4 个答案:

答案 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拥有您需要的一切(强调我的):

  • 返回此映射中包含的映射的Set视图。该集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。
  • 如果在对集合进行迭代时修改了映射(除非通过迭代器自己的remove操作,或者通过迭代器返回的映射条目上的setValue操作),迭代的结果是未定义的。
  • 设置支持元素删除,它通过Iterator.remove,Set.remove,removeAll,retainAll和clear操作从地图中删除相应的映射。
  • 不支持 添加 addAll 操作。

您还在寻找更多信息吗?