存储在玩家手中的扑克牌的最佳数据结构是什么?

Zac*_*ack 8 java arrays collections data-structures

我是java的初学者,我现在正在为Android开发像杜松子酒的纸牌游戏.我想知道创建Hand类的最佳实现是什么?存储Deck.dealt()返回的卡的最佳方式是什么?

  1. 排列
  2. 数组列表
  3. 向量
  4. HashSet的
  5. 链表

此外,如果有人能提供杜松子酒的开源链接,我将不胜感激.

Kev*_*ion 24

如果你真的想要了解集合类型之间的细微差别,请点击此处.

List在技​​术上不合适,除非比赛是Bohnanza(咳咳,这是有史以来最伟大的纸牌游戏之一,但我让我完成).

List除其他事项外,其中包括一手拿着王牌和王牌俱乐部,另一手牌包含国王和王牌俱乐部,从根本上讲是不一样的.这是对订单的强烈依赖,而不仅仅是"好吧,我想记住用户想要看到他们卡片的顺序",这是很多非List集合所拥有的属性,比如LinkedHashSet和Guava的ImmutableSet.

List 也意味着对于位于索引N的卡片有一些特别重要的意义.我知道没有纸牌游戏.

Set 通常不适合纸牌游戏 - 只使用一副完全独特的牌.

为了允许重复但仍然具有与顺序无关的相等性,要使用的类型是Guava Multiset.例如HashMultisetImmutableMultiset.请注意,大多数multiset实现通过仅存储卡和计数来表示多个"相等"卡,因此当迭代它们时,您手中的卡的副本必须始终一起显示.如果让用户自由控制她手中的牌顺序很重要,那么你需要LinkedListMultiset.

现在上课时间结束了......好吧,老实说吧.打电话myHand.equals(yourHand),或用整只手作为钥匙,实际上Map并不是你要做的事......所以继续使用,你会好的.:-)ArrayList


Eri*_*son 1

将它们存储在ArrayList.

手中的牌是按一定顺序排列的,而不是无序的一堆。此顺序保存在 a Listover a中Set

ArrayList还让您有机会通过索引选择特定的卡牌,这将有助于您实现游戏。

请记住,只要Hand正确设计类,您就可以在将来的任何时候轻松更改此数据结构。只要您在设计的任何类中牢记这一点,如果您意识到需要不同的东西,就可以随时更改它。