2

我在这里看一个 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 集上找不到太多东西。难道只是地图的临时副本?而且我根本找不到任何关于语法的信息:

Entry<?, ?>

谁能解释或指出我对这些问号发生了什么的解释?提前致谢。

4

4 回答 4

3

AnentrySet是 Map 中所有 Entries 的集合 - 即 Map 中所有键值对的集合。因为 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 所持有的类型时,我们可以使用完整类型:Entry<List<Integer>, Set<String>>。这避免了将键或值转换为特定类型的需要(以及转换为错误类型的风险)。

您还可以仅指定键的类型或值,如我上面的示例所示。

于 2012-10-19T22:58:29.950 回答
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();
于 2012-10-19T22:54:22.553 回答
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 变量。

于 2012-10-19T22:53:55.997 回答
0
Entry<?, ?> 

谁能解释或指出我对这些问号发生了什么的解释?

我可能是错的,但我认为程序员试图偷懒。应该是

Entry<List<Integer>, Set<String>>> 

那么不需要任何演员表

还:

我猜我的 google foo 很弱,除了 java doc 本身之外,我在 Entry 集上找不到太多东西。难道只是地图的临时副本?

Javadoc有你需要的一切(强调我的):

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

您还在寻找什么更多信息?

于 2012-10-19T23:15:55.250 回答