我正在尝试开发一个程序,通过将甲板分成两个然后交错来洗牌甲板。
Class Deck代表52张牌的一副牌。有两种方法:Deck(int n)和Card drawCard()。
Deck(int n)是构造函数。该参数告诉牌组应该洗牌多少轮。在每轮洗牌中,整个甲板首先被分成两个子甲板。副甲板然后交错成一整层甲板。
一些注意事项:
>
为了简化讨论,我们假设卡片是1,2,…,10。
Card drawCard()移除牌组中的第一张牌并将其返回。参考上面讨论中第二轮后的deck,drawCard()返回1,deck变为[8,6,4,2,9,7,5,3,10]。
我的交错方法:创建3个数组列表,其中2个(cards1和cards2)保存SA-HA和C2-DA牌,另一个(洗牌)保存交错的牌组。我设法实现了原始的deck顺序,但是当我尝试交错时,我得到了一个越界错误:“索引0越界for length 0”。
问题:我做错了什么?
下面是我的代码:
import java.util.*;
public class Deck {
private int rounds;
private ArrayList<Card> cards = new ArrayList<Card>();
private ArrayList<Card> cards1 = new ArrayList<Card>();
private ArrayList<Card> cards2 = new ArrayList<Card>();
private ArrayList<Card> shuffled = new ArrayList<Card>();
public Deck(int n) {
for (Suit s : Suit.values()) {
for (Rank r : Rank.values()) {
cards.add(new Card(r,s));
}
}
for (int x=0; x<n; x++) {
for (int i=0; i<((cards.size())/2); i++) {
cards1.add(cards.get(i));
for (int j=26; j<cards.size(); j++) {
cards2.add(cards.get(j));
for (int k=0; k<cards.size(); k++) {
shuffled.add(k*2, cards1.get(i));
shuffled.add(k*2+1, cards2.get(j));
}
}
}
}
System.out.println(cards);
System.out.println(cards1);
System.out.println(cards2);
System.out.println(shuffled);
rounds = n;
}
public Card drawCard() {
Card removed = shuffled.get(0);
shuffled.remove(0);
return removed;
}
}
public class Card {
private Rank rank;
private Suit suit;
public Card (Rank rank, Suit suit) {
this.rank = rank;
this.suit = suit;
}
public String toString() {
return suit + "" + rank;
}
}
public enum Suit {
SPADE("S"),
HEART("H"),
CLUB("C"),
DIAMOND("D");
private String suit;
Suit (String s) {
suit = s;
}
public String toString() {
return suit;
}
}
// YOU CANNOT MODIFY THIS FILE
public enum Rank {
TWO("2"),
THREE("3"),
FOUR("4"),
FIVE("5"),
SIX("6"),
SEVEN("7"),
EIGHT("8"),
NINE("9"),
TEN("10"),
JACK("J"),
QUEEN("Q"),
KING("K"),
ACE("A");
private String rank;
// Constructor
Rank (String r) {
rank = r;
}
public String toString() {
return rank;
}
}
public class TestDeck {
public static void main(String[] args) {
Deck deck;
deck = new Deck(0);
System.out.println("The original deck is: ");
for (int i = 0; i < 52; i++) {
System.out.print(deck.drawCard() + " ");
}
System.out.println();
System.out.println();
deck = new Deck(1);
System.out.println("After shuffling once is: ");
for (int i = 0; i < 52; i++) {
System.out.print(deck.drawCard() + " ");
}
System.out.println();
System.out.println();
deck = new Deck(2);
System.out.println("After shuffling twice is: ");
for (int i = 0; i < 52; i++) {
System.out.print(deck.drawCard() + " ");
}
System.out.println();
System.out.println();
}
}
TestDeck类的假设输出为
The original deck is:
S2 S3 S4 ... DK DA
After shuffling once is:
S2 C2 S3 C3 ... DA
After shuffling twice is:
S2 H2 C2 D2 ... DA
好了,亲爱的,其实你得到一个“索引出界”(天知道为什么……:),下面是我如何解决的(附评论):
public class Deck {
//constants for 52 and 26 :
private static final int FULL_DECK = Suit.values().length * Rank.values().length;
private static final int HALF_DECK = FULL_DECK / 2;
// use the constants, we need only one list (+2 temp lists, throw away
// "shuffeld" (not needed, confusing, we use "cards" for "full deck")):
private final ArrayList<Card> cards = new ArrayList<>(FULL_DECK);
public Deck(int n) {
init(); // as you had/see below
// more overview/structure ... and we can limit n:
for (int rounds = 0; rounds < n % 8; rounds++) {
interlace();
}
// comment this, since we do output in main method...
// System.out.println(cards);
}
init和“interlace”方法:
private void init() {
for (Suit s : Suit.values()) {
for (Rank r : Rank.values()) {
cards.add(new Card(r, s));
}
}
}
private void interlace() {
// throw exception, when illegal state
assert (!cards.isEmpty());
// left & right temp lists:
final ArrayList<Card> left = new ArrayList<>(HALF_DECK);
final ArrayList<Card> right = new ArrayList<>(HALF_DECK);
// put the first half of "cards" into "left"
left.addAll(cards.subList(0, HALF_DECK));
// ...the rest into "right"
right.addAll(cards.subList(HALF_DECK, FULL_DECK));
// clear "cards"
cards.clear();
// iterate half deck:
for (int i = 0; i < HALF_DECK; i++) {
// fill cards from "left" (with "double step")
cards.add(i * 2, left.get(i));
// ..and from "right" (with "double step" +1;)
cards.add(i * 2 + 1, right.get(i));
}
// done!
// debug:
// System.out.println(left);
// System.out.println(right);
// System.out.println(cards);
}
“draw”方法如下所示:
public Card drawCard() {
assert (!cards.isEmpty());
return cards.remove(0);
}
The original deck is:
S2 S3 S4 S5 S6 S7 S8 S9 S10 SJ SQ SK SA H2 H3 H4 H5 H6 H7 H8 H9 H10 HJ HQ HK HA C2 C3 C4 C5 C6 C7 C8 C9 C10 CJ CQ CK CA D2 D3 D4 D5 D6 D7 D8 D9 D10 DJ DQ DK DA
After shuffling once is:
S2 C2 S3 C3 S4 C4 S5 C5 S6 C6 S7 C7 S8 C8 S9 C9 S10 C10 SJ CJ SQ CQ SK CK SA CA H2 D2 H3 D3 H4 D4 H5 D5 H6 D6 H7 D7 H8 D8 H9 D9 H10 D10 HJ DJ HQ DQ HK DK HA DA
After shuffling twice is:
S2 H2 C2 D2 S3 H3 C3 D3 S4 H4 C4 D4 S5 H5 C5 D5 S6 H6 C6 D6 S7 H7 C7 D7 S8 H8 C8 D8 S9 H9 C9 D9 S10 H10 C10 D10 SJ HJ CJ DJ SQ HQ CQ DQ SK HK CK DK SA HA CA DA
..而且索引实际上超出了界限,因为您从未填充shuffeled
,当n==0
...iobex在main:system.out.print(Deck.DrawCard()+“”);
(和(n==0
))时
问题内容: 如果我有两个数组,例如 我想以以下模式[one [0],two [0],one [1],two [1]等合并/交织数组。 什么是实现合并功能的好方法? 问题答案: 如果两个数组的 长度相同, 那么这可能是一种解决方案: 此处枚举并行的数组,并返回一对对(2元素元组)的序列,每个数组中都有一个元素。从每对创建一个2元素数组,并将结果连接起来。 如果数组的 长度 可以 不同, 则可以将较长
问题内容: 写一个方法 公共静态ArrayList merge(ArrayList a,ArrayList b) 合并两个数组列表,两个数组列表中的元素交替出现。如果一个数组列表短于另一个数组列表,则请尽可能长地交替,然后附加较长数组列表中的其余元素。例如,如果a是 1 4 9 16 b是 9 7 4 9 11 然后合并返回数组列表 1 9 4 7 9 4 16 9 11 我尝试做的是编写一个带i
有人请让我知道我如何才能达到预期的结果。如有任何帮助,不胜感激。 谢谢
问题内容: 对于下面的输出,我需要做什么? 我调查了一下,但是正如javadoc所解释的,它只是一个接一个地追加,它不会交错/散布。 创建一个延迟串联的流,其元素是第一个流的所有元素,后跟第二个流的所有元素。 错误地给 如果我收集它们并进行迭代,但是希望获得更多Java8-y,Streamy :-),可以这样做 注意 我不想压缩流 “ zip”操作将从每个集合中获取一个元素并将其组合。 压缩操作的
在各种情况下,我多次面对这个问题。它对所有编程语言都是通用的,尽管我对C或Java很满意。 我希望避免一个数组在另一个数组中重复迭代,这将增加执行时间(长度A乘以长度B),这在巨大数组的情况下是太多了。 我们有没有办法在每一个数组中做一次传递来获得公共元素?
问题内容: 我有一个熊猫数据框。我尝试将包含字符串值的两列首先连接到列表中,然后使用zip,我将列表的每个元素都用’_’连接。我的数据集如下: 我想将这两列连接到第三列,如下所示,分别用于数据框的每一行。 我已经使用下面的代码在python中成功完成了此操作,但该数据框非常大,并且需要花费很长时间才能为整个数据框运行它。我想在PySpark中做同样的事情以提高效率。我已经成功读取了spark数据框