0

キーがコレクション (任意の種類のコレクション) であるマップを作成することは可能ですか?

最も一般的なコレクションで試してみると、コレクションを比較できるようにキャストできないと言われます。

カスタム コレクションの compareTo 関数を記述しようとしてきましたが、苦労しています。

compareTo を記述する必要があるか、またはマップによって受け入れられるコレクション/コレクションを受け入れる既製のマップを見つける必要があります。

コレクションをマップのキーとして使用するにはどうすればよいですか? 私は Stack Overflow に目を通し、この問題を何度かグーグル検索しましたが、確実な解決策は見つかりませんでした!


私がこれをやりたい理由は、カードのシャッフルを模倣する「シャッフル」シミュレーションを Java で書いたからです。特定の手 (コレクションとしてモデル化された) が出現する回数を数えられるようにしたいと考えています。次のようになります。

   H4,C3,D2: 8  
   H9,D6,S11: 10  
   ......
4

2 に答える 2

10

キーがコレクション (任意の種類のコレクション) であるマップを作成することは可能ですか?

はい、可能ですが、絶対にお勧めしません。コレクションが変更された場合、そのハッシュコードも変更される可能性があり、それが予期せぬ動作につながる可能性があります。

Map の javadocを参照してください。

注: 変更可能なオブジェクトをマップ キーとして使用する場合は、細心の注意を払う必要があります。オブジェクトがマップ内のキーであるときに、等値比較に影響を与える方法でオブジェクトの値が変更された場合、マップの動作は指定されません。


最も一般的なコレクションで試してみると、コレクションを比較できるようにキャストできないと言われます。

ソートされたマップ、つまり TreeMap を使用しない限り、キーは比較可能である必要はありません。単純な HashMap を使用すると、問題は発生しません。


あなたの編集に続いて、新しい不変の Hand クラスを作成します。

class Hand implements Comparable<Hand> {
    private final List<Card> cards;
    Hand(Card c1, Card c2, Card c3) {
        cards = Collections.unmodifiableList(Arrays.asList(c1, c2, c3));
    }
    //getters, no setters
    //implement compareTo
}

compareToで使用したい場合は実装TreeSet<Hand, Integer>し、たとえば手の強さで並べ替えます。

于 2013-06-19T21:40:57.203 に答える
2

はい、任意のコレクションをキーとして使用できます。TreeMap のような SortedMap が必要な場合は、順序を決定するために Comparator を提供する必要があります。ただし、任意の種類の HashMap を使用する場合は必要ありません。

Map<List<Integer>, String> map = new HashMap<>();
map.put(Arrays.asList(1,2,3), "one to three");
map.put(Arrays.asList(7,8,9), "seven eat nine");
System.out.println(map);

版画

{[1, 2, 3]=one to three, [7, 8, 9]=seven eat nine}
于 2013-06-19T21:41:54.257 に答える