【实现思路】
    1、要实现纸牌程序,首先需要完成纸牌的组装。牌面是由花色和数字(包括 J、Q、K、A 字母)两部分组成的,可以创建两个 ArrayList 集合作为花色集合和数字集合,存储时需要注意,比 10 大的牌用 J、Q、K 表示,1 用 A 来表示。
    2、将花色集合和数字集合这两个集合进行嵌套循环,将花色与数字组合,形成 52 张牌,并赋予其编号。将组合后的牌存放到一个 HashMap 集合中,集合的 key 值是编号, value 值是组装完成的纸牌。还有两张牌是大小王。由于组装规则不一致,需单独使用 add()方法将这两张牌加入到 HashMap 中。
    3、创建一个数字集合,用这个数字集合来代替纸牌完成洗牌和发牌的操作。由于纸牌的数量是 54 张,所欲创建的集合范围是 0~53。
    4、可以使用 Collectios 类的 shuffle()方法完成打乱数字集合的操作,实现洗牌效果。由于只有 3 个人,所以可以使用 for 循环,通过将数字与 3 取余的方法,将代表不同纸牌的数字分配给不同的人和底牌,实现发牌效果。
    5、洗牌和发牌完成之后,可通过 Collections 类的 sort()方法完成排序,之后通过 foreach 循环 HashMap 集合,根据数字查找对应的纸牌字符串,并存入新创建的字符串集合中,最后展示字符串集合。

    【实现代码】

    1. import java.util.ArrayList;
    2. import java.util.Collection;
    3. import java.util.Collections;
    4. import java.util.HashMap;
    5. public class PokerShuffleCards {
    6. public static void main(String[] args) {
    7. //准备花色
    8. ArrayList<String> color = new ArrayList<String>();
    9. color.add("♠");
    10. color.add("♥");
    11. color.add("♦");
    12. color.add("♣");
    13. //准备数字,用 ArrayList 将纸牌由小到大排序
    14. ArrayList<String> number = new ArrayList<String>();
    15. for (int i = 3; i <= 10; i++) {
    16. number.add(i + "");
    17. }
    18. number.add("J");
    19. number.add("Q");
    20. number.add("K");
    21. number.add("A");
    22. number.add("2");
    23. //定义一个 map 集合:用来将数字与每一张牌进行对应
    24. HashMap<Integer, String> map = new HashMap<Integer, String>();
    25. int index = 0; //纸牌编号
    26. for (String thisNumber : number) { //循环纸牌数字
    27. for (String thisColor : color) { //循环纸牌花色
    28. map.put(index++, thisColor + thisNumber); //将花色与数字组合,形成 52 张牌,并赋予对应编号
    29. }
    30. }
    31. //加入大小王
    32. map.put(index++, "smallking");
    33. map.put(index++, "bigking");
    34. //创建内容为 0~53 的数字集合,代表着 54 张牌
    35. ArrayList<Integer> cards = new ArrayList<Integer>();
    36. for (int i = 0; i <= 53; i++) {
    37. cards.add(i); //此时的 cards 顺序为 0-53
    38. }
    39. //洗牌,使用 Collections 工具类中的 shuffle()方法
    40. Collections.shuffle(cards); //此时的 cards 顺序已被打乱
    41. //创建三个玩家和底牌
    42. ArrayList<Integer> iPlayer = new ArrayList<Integer>();
    43. ArrayList<Integer> iPlayer2 = new ArrayList<Integer>();
    44. ArrayList<Integer> iPlayer3 = new ArrayList<Integer>();
    45. ArrayList<Integer> iSecretCards = new ArrayList<Integer>();
    46. //遍历这副洗好的牌,遍历过程中,将牌发到 3 个玩家和底牌中
    47. for (int i = 0; i < cards.size(); i++) {
    48. if (i >= 51) {
    49. iSecretCards.add(cards.get(i)); //留取 3 张底牌
    50. }else {
    51. if (i % 3 == 0) {
    52. iPlayer.add(cards.get(i)); //与 3 取余为 0 的牌发给玩家1
    53. }else if (i % 3 == 1) {
    54. iPlayer2.add(cards.get(i)); //与 3 取余为 1 的牌发给玩家2
    55. }else {
    56. iPlayer3.add(cards.get(i)); //与 3 取余为 2 的牌发给玩家3
    57. }
    58. }
    59. }
    60. //对每个人手中的牌排序,使用 Collections 工具类中的 sort()方法
    61. Collections.sort(iPlayer);
    62. Collections.sort(iPlayer2);
    63. Collections.sort(iPlayer3);
    64. //对应数字形式的每个人手中的牌,定义字符串形式的牌
    65. ArrayList<String> sPlayer = new ArrayList<String>();
    66. ArrayList<String> sPlayer2 = new ArrayList<String>();
    67. ArrayList<String> sPlayer3 = new ArrayList<String>();
    68. ArrayList<String> sSecretCards = new ArrayList<String>();
    69. //循环主键,从 Map 中获取纸牌
    70. for (Integer key : iPlayer) {
    71. sPlayer.add(map.get(key));
    72. }
    73. for (Integer key : iPlayer2) {
    74. sPlayer2.add(map.get(key));
    75. }
    76. for (Integer key : iPlayer3) {
    77. sPlayer3.add(map.get(key));
    78. }
    79. for (Integer key : iSecretCards) {
    80. sSecretCards.add(map.get(key));
    81. }
    82. //看牌
    83. System.out.println("玩家1:" + sPlayer);
    84. System.out.println("玩家2:" + sPlayer2);
    85. System.out.println("玩家3:" + sPlayer3);
    86. System.out.println("底牌:" + sSecretCards);
    87. }
    88. }

    1.既然arraylist是无序的,为什么遍历时是以存入的顺序进行遍历,15~27行。
    2.map的get()方法不是应该传入键所对应的类型吗,为什么这里可以传入interger类型,71~73