Skip to content

数组(Array)

字数
1871 字
阅读时间
9 分钟

数组(Array) 是一种用于存储多个相同类型数据的容器

里面按顺序放着很多小格子,每个小格子只能放同一种类型的数据(比如 int、String 等)

特点:

  • 数组长度固定(一旦创建,不能改变大小)。
  • 元素类型必须一致。
  • 每个元素都有一个索引(下标),从 0 开始。

数组的定义

静态初始化(直接给定内容)

示例代码
js
public static void main(String[] args) {   
    //静态初始化数组,定义数据的时候,数据已经是确定好的  
    String[] names = {"小明", "小红", "小刚", "小李", "小赵", "小钱", "小孙", "小王", "小张", "小刘", "小陈", "小杨", "小林", "小周", "小吴"};  
    callRandomStudents(names, 15);  
}
/**  
 * 随机点名的方法  
 * 该方法从给定的名字数组中随机选择指定次数的名字进行点名  
 * 主要用于课堂点名、活动抽奖等场景  
 *  
 * @param names         学生名字数组,包含所有可能被点到的名字  
 * @param numberOfCalls 将要进行点名的次数  
 */  
public static void callRandomStudents(String[] names, int numberOfCalls) {  
    Random random = new Random();  
    for (int i = 0; i < numberOfCalls; i++) {  
        int index = random.nextInt(names.length);  
        System.out.println(names[index]);  
    }  
}

二维数组

一种特殊的数组,它的每个元素本身也是一个数组

可以把它理解为一个 “表格” 或 “矩阵”,具有行和列的结构。

  1. 静态初始化(直接赋值)
js
int[][] arr = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
  1. 动态初始化(先指定行列数,再赋值)
js
int[][] arr = new int[3][3]; // 创建一个3行3列的二维数组
arr[0][0] = 1;
arr[0][1] = 2;
// ...
/*可以只指定行数,每行单独定义列数*/
int[][] arr = new int[3][]; // 只定义3行,列数未定
arr[0] = new int[2]; // 第0行有2列
arr[1] = new int[3]; // 第1行有3列
示例代码
js
public static void main(String[] args) {  
      
    start();  
  
}  
  
public static void start() {  
    // 二维数组的定义和初始化  
    int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};  
  
    // 指定要打印的行索引(例如:第 1 行)  
    int rowIndex = 1;  
  
    // 打印该行  
    if (rowIndex >= 0 && rowIndex < arr.length) {  
        for (int j = 0; j < arr[rowIndex].length; j++) {  
            System.out.print(arr[rowIndex][j] + " ");  
        }  
        System.out.println();  
    } else {  
        System.out.println("行索引超出范围");  
    }  
}

动态初始化

如果条件为真,则执行第一个代码块;否则执行第二个代码块。

示例代码
js
public class ArrayDemo2 {  
    public static void main(String[] args) {  
        // 掌握数组的另一种定义方式:动态初始化数组  
        int[] scores = new int[8];  
        // 主函数中声明数组,传递给 inputScore 方法  
        inputScore(scores); // 调用方法,录入成绩  
    }  
  
    // 设计一个方法,录入学生成绩  
    public static void inputScore(int[] scores) {  
        Scanner sc = new Scanner(System.in); // 在方法内部创建 Scanner 对象  
  
        // 录入学生的成绩,并存到数组中  
        for (int i = 0; i < scores.length; i++) {  
            System.out.println("请输入第" + (i + 1) + "个学生的成绩:");  
            scores[i] = sc.nextInt(); // 使用 nextInt() 读取整数输入  
        }  
  
        // 遍历数组,统计总分,统计最高分,统计最低分  
        int sum = 0;  
        int max = scores[0];  
        int min = scores[0];  
        for (int i = 0; i < scores.length; i++) {  
            sum += scores[i];  
            if (scores[i] > max) {  
                max = scores[i];  
            }  
            if (scores[i] < min) {  
                min = scores[i];  
            }  
        }  
    }
方法名功能示例
nextInt()整数int age = sc.nextInt();
nextDouble()读取浮点数double price = sc.nextDouble();
nextLine()读取字符串String name = sc.nextLine();
next()读取单个单词String word = sc.next();
close()关闭 Scannersc.close();

数组的常见方法

方法描述是否改变原数组
Arrays.toString(arr)打印一堆数组
Arrays.sort(arr)
排列数组
Arrays.equals(arr1, arr2)判断两个数组是否相等
Arrays.fill(arr, value)填充数组
Arrays.copyof(arr, length)赋值数组

小练习

完成数组求最值
示例代码
js
public static void main(String[] args) {    
    int [] scores = {10,9000,10000,20000,9500,-5};  
    int max = getMax(scores);  
    System.out.println("颜值最高的是:" + max);  
}  
//设计一个方法,求数组的最大值返回。  
public static int getMax(int[] arr){  
    //arr = {10,9000,10000,20000,9500,-5};  
    //1.定义一个变量,用来记录当前最大值,建议用第一个数据做为参照物。  
    int max = arr[0];  
    //2.从第二个数开始遍历,判断是否比当前最大值大  
  
    for (int i = 1; i < arr.length; i++) {  
        //3.依次和参照物比较,如果比参照物大,则更新参照物。  
        int data = arr[i];  
        if (arr[i] > max){  
            max = arr[i];  
        }  
    }  
    //4.返回最大值。  
    return max;  
}
输入两个整数数组,合并成一个新数组,并去除重复元素。
示例代码
js
import java.util.Scanner;

public class MergeAndDeduplicate {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 输入第一个数组
        System.out.print("请输入第一个数组长度:");
        int len1 = scanner.nextInt();
        int[] arr1 = new int[len1];
        System.out.println("请输入第一个数组元素:");
        for (int i = 0; i < len1; i++) {
            arr1[i] = scanner.nextInt();
        }

        // 输入第二个数组
        System.out.print("请输入第二个数组长度:");
        int len2 = scanner.nextInt();
        int[] arr2 = new int[len2];
        System.out.println("请输入第二个数组元素:");
        for (int i = 0; i < len2; i++) {
            arr2[i] = scanner.nextInt();
        }

        // 合并两个数组
        int[] merged = new int[len1 + len2];
        for (int i = 0; i < len1; i++) {
            merged[i] = arr1[i];
        }
        for (int i = 0; i < len2; i++) {
            merged[len1 + i] = arr2[i];
        }

        // 去重处理
        int[] unique = removeDuplicates(merged);

        // 输出结果
        System.out.print("合并并去重后的数组为:");
        printArray(unique);
    }

    /**
     * 自定义方法:去除数组中的重复元素
     */
    public static int[] removeDuplicates(int[] arr) {
        int n = arr.length;
        int[] result = new int[n];
        int index = 0;

        for (int i = 0; i < n; i++) {
            boolean isDuplicate = false;
            for (int j = 0; j < index; j++) {
                if (arr[i] == result[j]) {
                    isDuplicate = true;
                    break;
                }
            }
            if (!isDuplicate) {
                result[index++] = arr[i];
            }
        }

        // 缩短数组大小
        int[] finalResult = new int[index];
        System.arraycopy(result, 0, finalResult, 0, index);
        return finalResult;
    }

    /**
     * 自定义方法:打印数组
     */
    public static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}
开发一个简易的斗地主做牌洗牌
示例代码
js
public static void main(String[] args) {  
     
    start();  
}  
  
public static void start(){  
    //1.做牌:创建一个动态初始化的数组,存储54张牌  
    String[] pokers = new String[54];  
    //poker = [null,null,null,null,null,...]  
    //         0     1   2   3   4   5   6   7    
    //2.准备4种花色:红桃、方块、梅花、黑桃;还有点数:A、2、3、4、5、6、7、8、9、10、J、Q、K、;存入数组中去  
    String[] colors = {"♥","♠","♣","♦"};  
    String[] numbers = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};  
    //3.遍历点数,再遍历花色  
    int index = 0;//定义一个变量,记录牌存储的数组位置  
    for (int i = 0; i < numbers.length; i++) {  
        for (int j = 0; j < colors.length; j++) {  
            //拼接字符串  
            pokers[index++] = numbers[i] + colors[j];  
        }  
    }  
    //4.将大小王存到数组中去  
    pokers[index++] = "小王";  
    pokers[index] = "大王";  
  
    //5.打印牌  
    for (int i = 0; i < pokers.length; i++) {  
        System.out.print(pokers[i] + "\t");  
    }  
    System.out.println();  
  
    //6.洗牌:把54张牌的顺序打乱  
    //pokers = [A♥,2♥,3♥,4♥,5♥,6♥,7♥,8♥,9♥,10♥,J♥,...  ]  
    for (int i = 0; i < pokers.length; i++) {  
        int index1 = (int)(Math.random() * pokers.length);  
        int index2 = (int)(Math.random() * pokers.length);  
  
        //交换index1和index2的牌  
        //1.定义一个临时变量,用来存储index1位置的牌  
        String temp = pokers[index1];  
        //2.将index2位置的牌,赋值给index1位置  
        pokers[index1] = pokers[index2];  
        //3.将临时变量,赋值给index2位置  
        pokers[index2] = temp;  
  
    }  
  
    System.out.println("洗牌后:");  
    for (int i = 0; i < pokers.length; i++) {  
        System.out.print(pokers[i] + "\t");  
    }  
  
}

贡献者

撰写