数组(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]);
}
}
二维数组
一种特殊的数组,它的每个元素本身也是一个数组
可以把它理解为一个 “表格” 或 “矩阵”,具有行和列的结构。
- 静态初始化(直接赋值)
js
int[][] arr = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
- 动态初始化(先指定行列数,再赋值)
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() | 关闭 Scanner | sc.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");
}
}