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ドキュメント自体以外のエントリーセットについてはあまり見つけられません. マップの単なる一時的なコピーですか? そして、構文に関する情報がまったく見つかりません。

Entry<?, ?>

これらの疑問符で何が起こっているのか、誰かが説明したり、私に説明を指示したりできますか? ありがとうございます。

4

4 に答える 4

3

AnentrySetはマップ内のすべてのエントリのセットです。つまり、マップ内のすべてのキーと値のペアのセットです。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 が保持する型についてより具体的にする必要がある場合は、完全な type: を使用できますEntry<List<Integer>, Set<String>>。これにより、キーまたは値を特定の型にキャストする必要がなくなります (また、間違った型にキャストするリスクも回避されます)。

上記の例に示すように、キーのタイプまたは値のみを指定することもできます。

于 2012-10-19T22:58:29.950 に答える
1

エントリに関する情報は、Javadocにあります: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>です。

(*)ドキュメントには、「セットはマップに裏打ちされているため、マップへの変更はセットに反映され、その逆も同様です」と記載されています。

@MiserableVariableに感謝します。

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

誰かがそれらの疑問符で何が起こっているのかについて説明したり、説明を指示したりできますか?

私は間違っているかもしれませんが、プログラマーは怠惰になろうとしていると思います。あるべきだった

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

そうすれば、キャストは必要ありませんでした

また:

私のグーグルfooは弱いと思いますが、Javadoc自体以外のエントリセットでは多くを見つけることができません。マップの一時的なコピーですか?

Javadocには必要なものがすべて揃っています(私の強調):

  • このマップに含まれるマッピングのセットビューを返します。セットはマップに裏打ちされているため、マップへの変更はセットに反映され、その逆も同様です。
  • セットの反復が進行中にマップが変更された場合(イテレータ自体の削除操作、またはイテレータによって返されるマップエントリのsetValue操作を除く)、反復の結果は未定義です。
  • セットは、Iterator.remove、Set.remove、removeAll、retainAll、およびclear操作を介して、対応するマッピングをマップから削除する要素の削除をサポートします。
  • addまたはaddAll操作はサポートされていません。

これ以上の情報をお探しですか?

于 2012-10-19T23:15:55.250 に答える