如何交错两个数组列表?

2023-12-06

我正在尝试开发一个程序,通过将一副牌分成两部分然后将它们交错来洗牌。

班级甲板代表一副 52 张牌。有两种方法:牌组(int n) and 抽卡卡().

牌组(int n)是构造函数。该参数告诉我们应该洗牌多少轮。在每轮洗牌中,整副牌首先被分成两个子牌组。然后,子甲板交错成一个完整的甲板。

一些笔记:

  • 为了简化讨论,我们假设卡片是 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。

抽卡卡()取出牌组中的第一张牌并将其归还。参考上面讨论的第二轮后的牌组,抽卡()返回 1,牌组变为 [8, 6, 4, 2, 9, 7, 5, 3, 10]。

我的交错方法:创建 3 个数组列表,其中 2 个 (cards1 and cards2)持有 SA - HA 和 C2 - DA 牌,另一张(shuffled)持有交错的甲板。我设法实现了原始的牌组顺序,但是当我尝试隔行扫描时,出现越界错误:“索引 0 超出长度 0 的范围”。

Question: 我究竟做错了什么?

这是我的代码:

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

假设的输出为测试平台类 is

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

“draw”方法将如下所示:

    public Card drawCard() {
        assert (!cards.isEmpty());
        return cards.remove(0);
    }

使用相同的主要方法(Suit、Rank 类),我们得到:

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 

它不是“那个”线程安全......但出于演示目的......希望它有帮助! :)

..实际上索引超出范围,因为你never filled shuffeled, when n == 0... iobex 在Main: System.out.print(deck.drawCard() + " "); (and (n == 0))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何交错两个数组列表? 的相关文章

  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • 在 Struts 2 中传递 URL 参数而不使用查询字符串

    我想使用类似的 URL host ActionName 123 abc 而不是像这样传递查询字符串 host ActionName parm1 123 parm2 abc 我怎样才能在 Struts 2 中做到这一点 我按照下面的方法做了
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • Java:从集合中获取第一项

    如果我有一个集合 例如Collection
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • Java、Spring:使用 Mockito 测试 DAO 的 DataAccessException

    我正在尝试增加测试覆盖率 所以我想知道 您将如何测试 DAO 中抛出的 DataAccessExceptions 例如在一个简单的 findAll 方法中 该方法仅返回数据源中的所有数据 就我而言 我使用 Spring JdbcTempla
  • 如何从日期中删除毫秒、秒、分钟和小时[重复]

    这个问题在这里已经有答案了 我遇到了一个问题 我想比较两个日期 然而 我只想比较年 月 日 这就是我能想到的 private Date trim Date date Calendar calendar Calendar getInstanc
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • Java - 从 XML 文件读取注释

    我必须从 XML 文件中提取注释 我找不到使用 JDOM 或其他东西来让它们使用的方法 目前我使用 Regex 和 FileReader 但我不认为这是正确的方法 您可以使用 JDOM 之类的东西从 XML 文件中获取注释吗 或者它仅限于元
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • Lombok @Builder 不创建不可变对象?

    在很多网站上 我看到 lombok Builder 可以用来创建不可变的对象 https www baeldung com lombok builder singular https www baeldung com lombok buil
  • 数组上的 Bash 子字符串扩展

    我有一组带有给定后缀的文件 例如 我有一组带有后缀的pdf文件 pdf 我想使用子字符串扩展来获取不带后缀的文件名 对于单个文件我可以使用 file test pdf echo file 0 4 要对所有文件执行此操作 我现在尝试 file
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • 如何在Java中对对象数组进行字段级别排序以进行等级比较?

    In Java Class StudentProgress String Name String Grade CTOR goes here main class main method StudentProgress arrayofObje
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配

随机推荐

  • 如何修复“无法加载 TClassName 的单元 UnitName 符号信息。您想尝试自己查找此文件吗?”

    在delphi 中 创建ActiveX 控件曾经比现在更流行 然而 仍然可以使用 Delphi 创建 ActiveX 控件 这个问题假设Delphi 2007 但无论你使用什么Delphi版本 它都应该是相同的 当您创建 ActiveX 控
  • 移动文本模式光标不起作用

    我一直致力于在我目前正在开发的操作系统中移动文本模式光标 我根本无法让它显示出来 这是我用来更新光标的代码 void update cursor unsigned char cursor loc y pos Cols x pos curso
  • 如何确定给定 wxWidgets 中当前字体的字符串的大小

    有没有办法根据 C wxWidgets中当前选择的字体确定给定字符串的显示长度 以像素为单位 例如 如果我打印出字符串 Speed 并希望在 和后面的值之间放置 10 个像素 我需要知道 Speed 字符串有多长 有没有办法确定这一点 我似
  • 带有 Spark 流的多个 writeStream

    我正在使用 Spark Streaming 在尝试实现多个写入流时遇到一些问题 下面是我的代码 DataWriter writeStreamer firstTableData parquet CheckPointConf firstChec
  • Scala 注释实际上是什么? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我不懂Java 开始学习Scala 什么是注释以及它们的用途是什么 注释是附加到类 方法
  • 将 url 参数传递给 swf (flash) 影片

    这里是Flash新手 我正在尝试在浏览器中加载 swf 文件并将 url 参数传递给 flash 影片 如何在actionscript中访问flash电影中的url参数 这是一个示例网址 我确实找到了通过嵌入 对象标签传递参数的指针 但没有
  • MockMvc WebAppConfiguration:在 web.xml 中加载 servlet 映射

    我正在使用 MockMvc 编写集成测试 我想知道是否有一种方法可以从 web xml 加载 servlet 映射 这通常不重要 我有一个习惯HandlerInteceptor与请求 URI 匹配 来自HttpServletRequest
  • Trac,如何分层组织页面?

    I use trac管理我的项目 我想以与 trac 项目相同的方式组织 wiki 页面 即按类别 子类别等 标题索引trac 网站上的页面很好地解释了我想要获得的结果 我该如何实现这一目标 首先 你可以创建分层的wiki页面 只需修改ur
  • 有没有办法改变 UIToolbar 的高度?

    我有一个UIToolbar在 Interface Builder 中 我注意到它的高度被锁定为 44px 当然 我想把它做得更大 Apple 允许调整此控件的大小吗 如果是这样 我该怎么办 当然 只需将其框架设置不同即可 myToolbar
  • python 日志记录 - 使用 JSON 日志,我可以为每个日志添加“额外”值吗?

    我正在使用蟒蛇logging模块 以及python json logger我想添加一些键 app name myapp env prod 自动查看我的所有日 志 无需执行以下操作 logger info Something happened
  • 为什么当我设置元素位置:绝对时线性渐变消失?

    我制作了一个渐变背景 我想将这个文本块居中 我的目标是创建一个位于屏幕中间中心的标题 无论视口的分辨率如何 所以我把这个 header 设置为绝对位置 并使用了我在网上找到的这种集中方法 它完美地集中 问题是 渐变背景变成白色 看起来标题位
  • 查找开放会话数

    我正在寻找一种简单 无数据库 的方法来列出网站上有多少活跃用户 我能想到的最简单的方法是计算打开会话的数量 这段代码应该管用 number of users count scandir ini get session save path 当
  • std regex_search 仅匹配当前行

    我使用各种正则表达式逐行解析 C 源文件 首先我读取字符串中文件的所有内容 ifstream file stream commented cpp ifstream binary std string txt std istreambuf i
  • 如何将参数注入 TestCafé 测试?

    设想 我使用 API 运行用代码封装的 TestCaf 我有一个想要参数化的测试 使用不同的动态值进行测试 Problem Testcaf 不支持向测试发送参数 有没有办法注入值 您可以使用进程 env将参数从运行程序脚本传递给 TestC
  • 如何从 Guava MultiMap 中获取每个条目及其关联的相应值?

    我正在读取一个巨大的 csv 文件 其中包含重复的条目 我能够将整个 csv 文件读入Multimap 我还能够获取具有重复值的键集并将它们写入文件 我想获取与每个键关联的值并将其写入文件 但无法这样做 我似乎找不到任何可能对我有帮助的选项
  • 如何在 Rails 4 中将 PDF 转换为 Excel 或 CSV

    我已经搜索了很多 除非在这里问这个问题 否则我别无选择 你们知道有一个在线转换器有 API 或 Gem s 可以将 PDF 转换为 Excel 或 CSV 文件吗 我也不确定这里是否是问这个问题的最佳地点 我的应用程序是在 Rails 4
  • 有没有办法使用命令行 cURL 跟踪重定向?

    我知道在 php 脚本中 curl setopt ch CURLOPT FOLLOWLOCATION true 将遵循重定向 有没有办法使用命令行 cURL 跟踪重定向 使用位置标头标志 curl L
  • 为什么 re.sub('.*?', '-', 'abc') 返回 '-a-b-c-' 而不是 '--------'?

    这是python2 7的结果 gt gt gt re sub abc a b c 我以为的结果should如下 gt gt gt re sub abc 但事实并非如此 为什么 据我所知 对这种行为的最好解释来自regexPyPI 包 其目的
  • JSON.Stringify 在 Scripting.Dictionary 对象上失败

    我正在开发一个 ASP 经典项目 在该项目中我实现了 JScript JSON 类here 它能够与 VBScript 和 JScript 互操作 并且几乎与以下位置提供的代码完全相同 json org 我的团队经理要求我在这个项目中使用
  • 如何交错两个数组列表?

    我正在尝试开发一个程序 通过将一副牌分成两部分然后将它们交错来洗牌 班级甲板代表一副 52 张牌 有两种方法 牌组 int n and 抽卡卡 牌组 int n 是构造函数 该参数告诉我们应该洗牌多少轮 在每轮洗牌中 整副牌首先被分成两个子