【发布时间】:2013-06-19 21:38:45
【问题描述】:
是否可以创建一个键是集合(任何类型的集合)的映射?
如果我在最常见的集合上尝试它,我会被告知该集合无法进行比较。
我一直在尝试为自定义集合编写 compareTo 函数,但我很挣扎。
要么我需要编写 compareTo,要么我需要找到一个预制的 Map 来接受 Maps 接受的集合/Collection。
如何将集合用作地图上的键?我已经查看过 Stack Overflow 并且我已经多次搜索过这个问题,但我从未找到一个可靠的解决方案!
我想这样做的原因是我用 Java 编写了一个模拟洗牌的“洗牌”模拟。我希望能够计算出特定手(建模为集合)出现的次数。它看起来像这样:
H4,C3,D2: 8
H9,D6,S11: 10
......
【问题讨论】:
-
为什么要首先使用 Collection 作为键? Map 背后的整个概念是不可变键,而 Collections 直接违反了这个概念。
-
这不是一个好主意,除非集合是只读的,否则它们很可能会改变,从而改变它们的 equals 和 hashCode 的行为,并且很可能很难给出结果预测何时检查键是否已存在或检索地图中的键。
-
您可以使用 ArrayList 的 toString 方法将字符串用作键,或者您可以使用自定义格式化程序为您创建一个字符串,每次附加到字符串时,您都需要删除旧的字符串的条目。
-
@user962029 我确定我在更改 Card 和 Deck 类之前尝试过,但现在我已经更改了它我没有编写 compareTo 方法就没有尝试过......我一直在挣扎。
标签: java collections map comparable