创建一个集合作为密钥的地图?

Pur*_*ret 0 java collections map comparable

是否可以创建一个密钥是Collection(任何类型的集合)的映射?

如果我在大多数常见的收藏品上尝试它,我被告知收藏品不能用于比较.

我一直在尝试为自定义集合编写compareTo函数,但我很挣扎.

要么我需要编写compareTo,要么我需要找到一个接受地图接受的集合/集合的预制地图.

如何在地图上将集合用作关键字?我已经查看了Stack溢出,我已经多次搜索过这个问题,但我从来没有找到一个可靠的解决方案!


我想这样做的原因是我在Java中编写了一个模拟卡改组的'shuffle'模拟.我希望能够计算特定手(建模为集合)出现的次数.它看起来像这样:

   H4,C3,D2: 8  
   H9,D6,S11: 10  
   ......
Run Code Online (Sandbox Code Playgroud)

ass*_*ias 10

是否可以创建一个密钥是Collection(任何类型的集合)的映射?

是的,这是可能的,但绝对不推荐.如果您的集合发生更改,则其哈希码可能也会更改,这可能会导致令人惊讶的行为.

请参见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
}
Run Code Online (Sandbox Code Playgroud)

并实现,compareTo如果你想在一个TreeSet<Hand, Integer>手中使用它,并用手分类,例如.

  • @assylias从技术上讲,它需要是不可修改的和副本.如果你只使用`unmodifiableCollection(coll)`,你仍然可以修改底层集合.:P (6认同)