4

对于编程课,我正在为第一个家庭作业创建一个二十一点程序。教授给了我们一个示例 Card 类,其中包括将它们添加到卡片组的方法。对于她的套牌,她使用了一个 ArrayList,您可以使用 Collections.shuffle() 方法轻松地进行 Knuth Shuffle。

尽管(显然)该方法不适用于堆栈,但我认为堆栈结构最适合该程序,因为您可以将卡片弹出和推入和推出牌组。

4

8 回答 8

20

两者都java.util.ArrayList<E>实现java.util.stack<E>java.util.List<E>接口,并Collections.shuffle()以ajava.util.List<?>为参数。您应该能够将 a 传递给StackCollections.shuffle()除非您使用的是未实现的不同堆栈实现java.util.list<E>。如果你是,我会建议你切换到不同的堆栈实现。

于 2009-01-21T22:19:07.713 回答
2

我想在 ArrayList 上进行堆栈操作要容易得多。

于 2009-01-21T22:19:07.480 回答
2

堆栈是一个列表,因此您可以在堆栈上调用 Collections.shuffle()。

也就是说,Stack 是一个古老的类,就像 Vector 一样,有点过时了。现在你会使用Dequeue(作为队列或堆栈工作的双端队列)而不是堆栈,但是,Dequeue 不是列表,所以它们不能被洗牌。

此外,您始终可以将您的卡片放入列表中,将它们洗牌,然后将它们全部添加到出列队列中

于 2009-01-21T22:23:25.867 回答
0

没有理由为什么堆栈结构也不应该是随机访问的(java.util.Stack 确实如此,尽管这有其自身的问题)。除此之外,您可以将堆栈的元素弹出到 ArrayList 中,随机播放,然后将它们推回堆栈。

于 2009-01-21T22:18:07.013 回答
0

不,Fisher-Yates shuffle 依赖于对数据集的随机访问。您需要一些允许 get(int index) 的 Collection。如果您需要一个堆栈,只需使用一个列表。push 和 pop 只需调用 get(0) 和 add(0)。这比实现一些自定义堆栈类要好。使用你所拥有的,不要发明新的课程。

于 2009-01-21T22:23:23.620 回答
0

亚当的答案最适合堆栈。对于纸牌游戏,我通常使用的是一个简单的数组列表并删除随机元素。无需改组。

于 2009-01-21T22:29:09.630 回答
0

只需在将牌放入堆栈之前/时洗牌。由于正确实施的 Knuth 洗牌不允许替换已经遍历的牌组部分中的牌,因此您可以在进行时将它们简单地放入堆栈中......

由于 java 不会让您将堆栈视为随机访问列表,因此只需从堆栈复制到 ArrayList 以进行洗牌阶段(额外的 52 个元素 ArrayList 敲击没什么大不了的)

于 2009-01-21T22:31:58.860 回答
0

Collections.shuffle() 方法为您执行此操作,您不必明确说明。

“如果指定的列表没有实现 RandomAccess 接口并且很大,则 shuffle() 的这种实现在对其进行混洗之前将指定的列表转储到一个数组中,并将经过混洗的数组转储回列表中。这避免了会导致的二次行为从将“顺序访问”列表改组到位。”

这就是 java 文档中关于 Collections.shuffle() 方法实现的内容,因此传递 java.util.Stack (java.util.List 接口的实现)应该可以工作......

于 2009-01-21T23:36:24.830 回答