Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何交错两个数组列表?_Java_Arrays_Loops_Arraylist_Nested - Fatal编程技术网

Java 如何交错两个数组列表?

Java 如何交错两个数组列表?,java,arrays,loops,arraylist,nested,Java,Arrays,Loops,Arraylist,Nested,我正试图开发一个程序,通过将一副牌分成两副,然后交错排列,来洗牌一副牌 类牌组表示一副52张牌。有两种方法:Deck(int n)和Card drawCard() Deck(int n)是构造函数。该参数指示牌组应洗牌多少回合。在每一轮洗牌中,整个牌组首先分为两个子牌组。子甲板然后交错成一个完整的甲板 一些注释: import java.util.*; public class Deck { private int rounds; private ArrayList<Ca

我正试图开发一个程序,通过将一副牌分成两副,然后交错排列,来洗牌一副牌

类牌组表示一副52张牌。有两种方法:Deck(int n)和Card drawCard()

Deck(int n)是构造函数。该参数指示牌组应洗牌多少回合。在每一轮洗牌中,整个牌组首先分为两个子牌组。子甲板然后交错成一个完整的甲板

一些注释

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;
    }
}


  • 为了简化讨论,我们假设卡片是1,2,…,10

  • 在第一轮中,整个甲板分为[1,2,3,4,5]和[6,7,8,9,10]。然后,我们通过将两个子甲板交错到[1,6,2,7,3,8,4,9,5,10]来组合这两个子甲板

  • 在第二轮中,我们再次将整个甲板分成两个子甲板[1,6,2,7,3]和[8,4,9,5,10],然后将它们合并为[1,8,6,4,2,9,7,5,3,10]

  • 因为我们总是在第一副牌组中的牌放在第二副牌组之前,所以无论我们洗牌多少轮,牌组中的第一张牌和最后一张牌都保持不变

  • 甲板的原始顺序为S2、S3、…、SK、SA、H2、…、HA、C2、…、CA、D2、…、DA

Card drawCard()移除牌组中的第一张牌并将其返回。在上面讨论的第二轮之后,请参考组块,drawCard()返回1,组块变为[8,6,4,2,9,7,5,3,10]

我的交错方法:创建3个数组列表,其中2个(卡片1和卡片2)持有卡SA-HA和C2-DA,另一个(洗牌)持有交错的卡组。我设法实现了原始的组顺序,但是当我尝试交错时,我得到了一个越界错误:“索引0长度越界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;
    }
}



好的,亲爱的,实际上你得到了一个“索引超出范围”(天知道为什么…:),下面是我如何解决它的(带注释):

使用相同的主要方法(西服、等级),我们得到:

它不是线程安全的…但出于演示目的。。。希望有帮助!:)


…而索引实际上超出了范围,因为当
n==0
时,您从未填充
shuffeed
。。。iobex位于
Main:System.out.print(deck.drawCard()+)(和(
n==0

非常欢迎/感谢!有趣的事实:请尝试:
n==26
n==26*52
!:)。。。所以它“不是真正随机的”。。。26 x 52“洗牌”可以用这个。。。因此,将
n
切割为
n%(26*52)
对于(太)大的
n
s是一个不错的选择。对不起……它开始在
n==8
上重复;(
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();
  }
}

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);
    }
    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);
    }
    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