Java关于Array的问题

我目前是刚学习java,因为在国外上学,讲解能力是在是只能用灾难来形容。所以来这里请求帮助。
目前已经学习了Scanner,radom,if类,while,do,for类。现在开始学习Array。但实在是不理解。也只能用以上的语句。其他的没学过不让用
这是问题,

img

如图所示,创建三个array,第三个array需要将前两个整合起来。对于这个我是实在不理解

这是第二问:

img

英文:Section2: In this section, you need to randomly shuffle the deck of cards created in section1 as
below:
Algorithm to shuffle the deck:
▪ Consider each card index i from 0 to 51
• Calculate a random index r between i and 51
• Exchange deck[i] with deck[r]

机器翻译:Section2:在本节中,您需要将section1中创建的牌组随机洗牌为
以下:

洗牌的算法:
▪ 考虑每张卡片索引 i 从 0 到 51
• 计算一个介于 i 和 51 之间的随机索引 r
• 交换 deck[i] 和 deck[r]

对于这个问题似乎是将卡牌随机排列。我看例子用了两个for 语句。将for语句嵌套在另一个里面。因此如果可以麻烦使用两个for来回答这个问题。

第三问是
英文:
Algorithm to play the game:

  1. Prompt the user to enter number of cards, which will represent the winning cards, and
    store it in variable cardNum
  2. The system randomly selects cardNum unique cards from the deck and store them in a
    new array called winningCards
  3. Create a counter variable called totalDrawnCards to hold the total number of drawn
    cards and initialize it to 0
  4. The user randomly draws cards one a time and find whether the drawn card match any
    of the winning cards or not.
  5. If the drawn card matches any of the winning cards, mark that card as selected.
  6. Increase totalDrawnCards by one.
  7. Repeat steps 4 through 6 until all the winning cards are drawn.

机器翻译:
玩游戏的算法:

  1. 提示用户输入代表中奖牌的牌数,以及
    将其存储在变量 cardNum 中
  2. 系统从牌组中随机选择cardNum唯一的牌,存入一个
    名为 winningCards 的新数组
  3. 创建一个名为totalDrawnCards的计数器变量来保存抽取的总数
    卡并将其初始化为0
  4. 用户每次随机抽一张牌,看抽到的牌是否匹配
    中奖卡与否。
  5. 如果抽到的牌与任何获胜牌相匹配,则将该牌标记为已选中。
  6. 将 totalDrawnCards 增加一。
  7. 重复步骤 4 到 6,直到抽出所有中奖牌。

这是输出的举例:

img

你不是已经学了random么。怎么还不能用呢?
第一问你看看这样满足你不

import java.util.Random;

public class Test01 {
    public static void main(String[] args) {
        String[] suits = {"\u2660", "\u2663", "\u2665", "\u2666",};
        String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
        String[] deck = new String[suits.length * ranks.length];

        for (int i = 0; i < suits.length; i++) {
            for (int j = 0; j < ranks.length; j++) {
                deck[i * ranks.length + j] = ranks[j] + suits[i];
            }
        }
        System.out.println("The original deck is arranged as below:");
        for (int i = 0; i < deck.length; i++) {
            System.out.print(deck[i]+" ");
        }
        System.out.println();

        Random random = new Random();

        for (int i = 0; i < deck.length; i++) {
            int r = random.nextInt(51);
            String temp = deck[i];
            deck[i] = deck[r];
            deck[r] = temp;
        }
        System.out.println("The shuffled deck is arranged as below:");
        for (int i = 0; i < deck.length; i++) {
            System.out.print(deck[i]+" ");
        }
        System.out.println();

    }
}

我看到回答,有一点我没补充好,就是不能用meth。random。需要import这个方法。
然后就是所有的提问都在一个class里面完成。最后运行得到我发布的输出的结果。
然后是以这样为开头的

String[] suits = {"\u2660","\u2663","\u2665","\u2666",};
     String[] ranks = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
     String[] deck = new String[suits.length * ranks.length];

然后我看老师的例子是用这样的if来写第二问。

for(int i =0 ; i < suits.length ; i++) {
            for (int j = 0; j < ranks.length; j++) {

麻烦以这样的方式来完成,麻烦了!



Java中的数组是一种用于存储相同类型数据的集合。数组在内存中是连续的,可以使用索引来访问其中的元素。

Java中的数组有以下几个特点:

  1. 数组长度不可变
  2. 数组元素必须是同一种数据类型
  3. 数组下标从0开始

以下是Java中创建和使用数组的示例代码:

// 定义一个整型数组
int[] numbers = new int[5];

// 赋值
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
numbers[3] = 4;
numbers[4] = 5;

// 访问元素
System.out.println(numbers[0]); // 1

// 使用循环遍历数组
for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]);
}

// 定义并初始化数组
int[] numbers2 = {1, 2, 3, 4, 5};
```Java提供了丰富的数组操作方法,包括以下几种常用操作:

1. 数组排序

使用Arrays类的sort方法可以对数组进行排序,示例代码如下:

int[] numbers = {5, 1, 4, 2, 3};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers)); // [1, 2, 3, 4, 5]


2. 数组复制

使用Arrays类的copyOf方法可以将一个数组复制到一个新数组中,示例代码如下:

int[] numbers1 = {1, 2, 3, 4, 5};
int[] numbers2 = Arrays.copyOf(numbers1, numbers1.length);
System.out.println(Arrays.toString(numbers2)); // [1, 2, 3, 4, 5]


3. 数组查找

使用Arrays类的binarySearch方法可以在有序数组中查找指定元素的位置,如果找到,则返回其索引,否则返回负数,示例代码如下:

int[] numbers = {1, 2, 3, 4, 5};
int index = Arrays.binarySearch(numbers, 3);
System.out.println(index); // 2


4. 多维数组

Java中支持多维数组,比如二维数组和三维数组,示例代码如下:

// 定义一个二维数组
int[][] matrix = new int[3][3];

// 赋值
matrix[1][1] = 1;

// 访问元素
System.out.println(matrix[1][1]); // 1

// 定义并初始化二维数组
int[][] matrix2 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

// 访问元素
System.out.println(matrix2[1][1]); // 5

```

以上就是Java中数组的基本操作和一些常用方法。

如果是直接洗牌,不考虑怎么洗的话,直接使用Collections类中的shuffle方法即可打乱牌的顺序:

Collections.shuffle(pokes)   

英文不太好,意思没有很理解,这里找了一个关于Java实现扑克牌的生成、洗牌、发牌、排序的例子,看下对您是否有帮助:
https://blog.csdn.net/qq_48922459/article/details/106950607
Java实现扑克牌游戏的示例代码:
https://www.jb51.net/article/263332.htm

参考GPT和自己的思路:以下是三个问题的Java代码实现:
问题一

public class DeckOfCards {
  public static void main(String[] args) {
    // Define suits array
    char[] suit = { '\u2663', '\u2666', '\u2665', '\u2660' }; // clubs, diamonds, hearts, spades
    // Define ranks array
    String[] rank = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
    // Define deck array
    String[] deck = new String[52];
    int index = 0;
    for (int i = 0; i < suit.length; i++) {
      for (int j = 0; j < rank.length; j++) {
        deck[index] = rank[j] + suit[i];
        index++;
      }
    }
    // Print the deck of cards
    for (int i = 0; i < deck.length; i++) {
      System.out.print(deck[i] + " ");
    }
  }
}


问题二

public class DeckOfCards {
  public static void main(String[] args) {
    // Define suits array
    char[] suit = { '\u2663', '\u2666', '\u2665', '\u2660' }; // clubs, diamonds, hearts, spades
    // Define ranks array
    String[] rank = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
    // Define deck array
    String[] deck = new String[52];
    int index = 0;
    for (int i = 0; i < suit.length; i++) {
      for (int j = 0; j < rank.length; j++) {
        deck[index] = rank[j] + suit[i];
        index++;
      }
    }
    // Shuffle the deck of cards
    for (int i = 0; i < deck.length; i++) {
      int r = i + (int) (Math.random() * (deck.length - i));
      String temp = deck[r];
      deck[r] = deck[i];
      deck[i] = temp;
    }
    // Print the shuffled deck of cards
    for (int i = 0; i < deck.length; i++) {
      System.out.print(deck[i] + " ");
    }
  }
}

问题三

import java.util.Scanner;
import java.util.Random;
import java.util.ArrayList;

public class DeckOfCards {
    public static void main(String[] args) {
        
        // Define the card deck
        String[] suits = {"\u2663", "\u2666", "\u2665", "\u2660"}; // Unicode for suits
        String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
        String[] deck = new String[52];
        for (int i = 0; i < ranks.length; i++) {
            for (int j = 0; j < suits.length; j++) {
                deck[suits.length*i + j] = ranks[i] + suits[j];
            }
        }
        
        // Shuffle the card deck
        Random rand = new Random();
        for (int i = 0; i < deck.length; i++) {
            int r = i + rand.nextInt(52-i);
            String temp = deck[i];
            deck[i] = deck[r];
            deck[r] = temp;
        }
        
        // Play the card game
        Scanner scanner = new Scanner(System.in);
        System.out.println("How many winning cards do you want?");
        int cardNum = scanner.nextInt();
        
        // Select the winning cards
        ArrayList<String> winningCards = new ArrayList<String>();
        for (int i = 0; i < cardNum; i++) {
            int r = rand.nextInt(52);
            while (winningCards.contains(deck[r])) {
                r = rand.nextInt(52);
            }
            winningCards.add(deck[r]);
        }
        
        // Draw cards and check for matches
        int totalDrawnCards = 0;
        boolean[] selectedCards = new boolean[52];
        while (winningCards.size() > 0) {
            System.out.println("Draw a card (enter 'draw' or 'd'):");
            String input = scanner.next();
            if (input.equals("draw") || input.equals("d")) {
                int r = rand.nextInt(52);
                totalDrawnCards++;
                if (winningCards.contains(deck[r])) {
                    int index = winningCards.indexOf(deck[r]);
                    winningCards.remove(index);
                    selectedCards[r] = true;
                    System.out.println("Match found! You have " + winningCards.size() + " winning card(s) left.");
                } else {
                    System.out.println("No match found.");
                }
            }
        }
        
        // Print game results
        System.out.println("Congratulations, you found all the winning cards!");
        System.out.println("You drew " + totalDrawnCards + " cards.");
        System.out.println("Here is the list of winning cards:");
        for (String card : winningCards) {
            System.out.println(card);
        }
        System.out.println("Here is the list of cards you drew:");
        for (int i = 0; i < deck.length; i++) {
            if (selectedCards[i]) {
                System.out.print(deck[i] + " ");
            } else {
                System.out.print("- ");
            }
            if ((i+1) % 13 == 0) {
                System.out.println();
            }
        }
        
    }
}


以下答案由GPT-3.5大模型与博主波罗歌共同编写:
关于第一问:

首先,我们需要了解Array是什么。简单来说,Array就是集合、数组,是一种可以存储固定大小的元素序列的容器。

所以,当我们需要将前两个数组合并为一个数组时,可以通过创建一个新的数组,并使用for循环将前两个数组的元素添加到新的数组中。

具体代码如下:

int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = {6, 7, 8, 9, 10};
int[] arr3 = new int[arr1.length + arr2.length];

for(int i = 0; i < arr1.length; i++) {
    arr3[i] = arr1[i];
}
for(int i = 0; i < arr2.length; i++) {
    arr3[arr1.length + i] = arr2[i];
}

以上代码中,我们定义了两个数组arr1和arr2,分别包含了5个元素。然后我们定义了一个新的数组arr3,其长度为arr1和arr2的长度之和。

接着,我们使用for循环将arr1和arr2的元素添加到arr3中。注意,在将arr2的元素添加到arr3时,我们需要将索引位置偏移arr1的长度。

关于第二问:

在这个问题中,我们需要通过for循环来随机洗牌。

具体代码如下:

int[] deck = new int[52];
for(int i = 0; i < deck.length; i++) {
    deck[i] = i; // 初始化牌组的索引
}

// 随机洗牌
for(int i = 0; i < deck.length; i++) {
    int r = i + (int)(Math.random() * (52 - i));
    int temp = deck[i];
    deck[i] = deck[r];
    deck[r] = temp;
}

以上代码中,我们首先定义了一个长度为52的数组deck,其中每个元素代表一张牌的索引。

然后,我们使用for循环,从0遍历到51,计算一个介于当前索引和51之间的随机索引r,然后将当前位置的牌和随机位置的牌交换。这个操作可以通过使用一个中间变量temp来进行元素交换。

关于第三问:

在这个问题中,我们需要按照题目的需求来实现一个纸牌游戏。我们可以按照如下代码来实现:

Scanner scanner = new Scanner(System.in);

// 提示用户输入中奖牌数量
System.out.println("请输入中奖牌数量:");
int cardNum = scanner.nextInt();

int[] deck = new int[52];
for(int i = 0; i < deck.length; i++) {
    deck[i] = i; // 初始化牌组的索引
}

// 随机洗牌
for(int i = 0; i < deck.length; i++) {
    int r = i + (int)(Math.random() * (52 - i));
    int temp = deck[i];
    deck[i] = deck[r];
    deck[r] = temp;
}

// 创建中奖牌数组
int[] winningCards = new int[cardNum];
for(int i = 0; i < cardNum; i++) {
    winningCards[i] = deck[i];
}

// 初始化计数器
int totalDrawnCards = 0;

// 游戏开始
while(totalDrawnCards < cardNum) {
    // 提示用户抽牌
    System.out.println("请输入1-52之间的数字,表示您要抽哪张牌:");

    int selectedCard = scanner.nextInt();
    if(selectedCard < 1 || selectedCard > 52) {
        // 输入不合法
        System.out.println("输入不合法,请重新输入:");
    } else {
        // 检查中奖牌
        boolean selected = false;
        for(int i=0; i<winningCards.length; i++) {
            if(winningCards[i] == (selectedCard - 1)) {
                // 已选中
                System.out.println("中奖了:第" + (i+1) + "张牌");
                winningCards[i] = -1; // 标记已选
                selected = true;
                break;
            }
        }
        if(!selected) {
            System.out.println("没有中奖"); 
        }

        totalDrawnCards++; // 统计抽取的牌数
    }
}

System.out.println("恭喜你中了所有中奖牌");

以上代码中,我们先提示用户输入中奖牌数量,然后使用之前的随机洗牌方法创建一个牌组deck,并从牌组中选出中奖牌创建了一个新的数组winningCards。

接着,我们使用一个while循环来进行游戏。在每次循环中,先提示用户选择一张牌,并检查选择的牌是否为中奖牌。如果是,就标记该牌已选中,并输出中奖信息;否则,输出没有中奖信息。同时,我们需要在每次循环中统计抽取的牌数,也就是计数器totalDrawnCards的值。当抽取的牌数等于中奖牌数时,游戏结束。

最后,我们输出恭喜信息,结束游戏。
如果我的回答解决了您的问题,请采纳!

来吧,展示

package com.xiao.nettyStudy.test;

/**
 * @author jx
 * @date 2023/3/10 10:31
 */
public class Test01 {
    public static void main(String[] args) {
        String[] suits = {"\u2660", "\u2663", "\u2665", "\u2666",};
        String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
        String[] deck = new String[suits.length * ranks.length];

        for (int i = 0; i < suits.length; i++) {
            for (int j = 0; j < ranks.length; j++) {
                deck[i * ranks.length + j] = ranks[j] + suits[i];
            }
        }
        System.out.println("The original deck is arranged as below:");
        for (int i = 0; i < deck.length; i++) {
            System.out.print(deck[i] + " ");
        }
        System.out.println();
        
        long time = System.currentTimeMillis();

        for (int i = 0; i < deck.length; i++) {
            int r = (int) time % 51;
            String temp = deck[i];
            deck[i] = deck[r];
            deck[r] = temp;
        }
        System.out.println("The shuffled deck is arranged as below:");
        for (int i = 0; i < deck.length; i++) {
            System.out.print(deck[i] + " ");
        }
        System.out.println();

    }
}

```java


```

对于第一个问题,您需要创建三个数组:suit,rank和deck。其中,suit和rank数组分别存储四个花色和13个牌面值。deck数组是由suit和rank数组组成的,即将每个花色与每个牌面值结合起来。在下面的代码中,我使用char类型来存储suit和rank数组中的元素,因为每个花色都可以用一个unicode字符来表示。


```java
public class DeckOfCards {
    public static void main(String[] args) {
        char[] suit = {'\u2663', '\u2666', '\u2665', '\u2660'};
        char[] rank = {'2', '3', '4', '5', '6', '7', '8', '9', '1', 'J', 'Q', 'K', 'A'};
        char[] deck = new char[52];
        int index = 0;
        for (int i = 0; i < suit.length; i++) {
            for (int j = 0; j < rank.length; j++) {
                deck[index] = rank[j];
                index++;
            }
        }
        System.out.println(Arrays.toString(deck));
    }
}
对于第二个问题,您需要按照所述的算法随机洗牌。以下是Java代码:

```java
public class DeckOfCards {
    public static void main(String[] args) {
        char[] suit = {'\u2663', '\u2666', '\u2665', '\u2660'};
        char[] rank = {'2', '3', '4', '5', '6', '7', '8', '9', '1', 'J', 'Q', 'K', 'A'};
        char[] deck = new char[52];
        int index = 0;
        for (int i = 0; i < suit.length; i++) {
            for (int j = 0; j < rank.length; j++) {
                deck[index] = rank[j];
                index++;
            }
        }
        System.out.println("Original deck: " + Arrays.toString(deck));

        // Shuffle the deck
        Random random = new Random();
        for (int i = 0; i < deck.length; i++) {
            int r = i + random.nextInt(52 - i);
            char temp = deck[i];
            deck[i] = deck[r];
            deck[r] = temp;
        }

        System.out.println("Shuffled deck: " + Arrays.toString(deck));
    }
}


对于第三个问题,您需要提示用户输入中奖牌的数量,并随机抽取中奖牌。以下是Java代码:

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class DeckOfCards {
    public static void main(String[] args) {
        char[] suit = {'\u2663', '\u2666', '\u2665', '\u2660'};
        char[] rank = {'2', '3', '4', '5', '6', '7', '8', '9', '1', 'J', 'Q', 'K', 'A'};
        char[] deck = new char[52];
        int index = 0;


关于这个问题,笔者之前写过一篇关于炸金花的博客,感兴趣的话,可以参考一下!!用Java语言简单实现:炸金花,不知道你有没有兴趣跟着笔者来研究一下呀 原文链接为:

也是符合你的题目需求!!!可以大致看一下!!运行结果没点额问题!!