本文目录
第5章 数组
1. 数组
1.1 为什么要使用数组
分类存放数据,便于查找。
1.2 数组的概念
数组:存放同一类型数据的容器空间。
1.3 数组的定义
- 数组是一个变量,存储相同 数据类型 的一组数据。
数组的使用:
- 声明数组
- 初始化
- 赋值
- 使用
数组定义的三种方式:
-
数据类型[] 数组名 = new 数据类型[数组大小](推荐使用)
数据类型 数组名[] = new 数据类型[数组大小]
-
数据类型[] 数组名 = {值1, 值2, 值3 …}
-
数据类型[] 数组名 = new 数据类型[]{值1, 值2, 值3 …}
数组常见的错误:
- 数组越界
- 空指针
- 定义(数组存放的数据必须为同一数据类型的数据)
1.4 数组的内存模型
数组是一个引用变量,引用存放于栈中,具体数据存放于堆中。
Java 的堆栈模型。
总结:
- 数组是存放同一数据类型的容器空间
- 数组在定义时,一定要指定其具体大小
- 数组的下标是从 0 开始的
- 数组是一个引用变量,数组名可以看做是指向数组地址的一个引用
- 数组声明后,数组中的元素会有一个对应数据类型的初始值
1.5 数组相关的操作
-
获取最值:最大值或最小值
-
public class GetMaxOrMin { public static void main(String[] args) { // 初始化一个数组,默认为数组中的第一个数 int[] nums = { 3, 13, 63, 11, 85, 1, 0, 78 }; // 定义初始的最大值和最小值 int max = nums[0]; int min = nums[0]; // 循环遍历比较 for (int i = 0; i < nums.length; i++) { if (max < nums[i]) { max = nums[i]; } if (min > nums[i]) { min = nums[i]; } } System.out.println("最大值:" + max); System.out.println("最小值:" + min); } }
-
-
反转/数组拷贝
-
public class ArrayReverse { public static void main(String[] args) { // 初始化一个数组 int[] nums = { 3, 13, 63, 11, 85, 1, 0, 78 }; // 初始化结果数组 int[] numsReverse = new int[nums.length]; System.out.println("反转前:"); show(nums); // 进行反置赋值 for (int i = 0; i < nums.length; i++) { numsReverse[nums.length - i - 1] = nums[i]; } System.out.println("\n反转后:"); show(numsReverse); } private static void show(int[] num) { for (int i = 0; i < num.length; i++) { System.out.print(num[i] + " "); } } }
-
-
查表法:通过下标与值的对应关系实现功能
-
String[] weeks = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"}; System.out.println(weeks[5]);
-
-
基本查找:查找数组中是否含有某数值
-
数组扩容及缩容(抓阄游戏的实现)
-
/** * 抓阄游戏的实现 * 要求: * 将本班同学姓名储存在一个一维数组中,当按回车键时抓住一个同学,抓过的同学下次不能再被抓住 * 分析: * 数组扩容及缩容,随机数的产生 * * @author SuMo */ public class Test_05_array { public static void main(String[] args) { lotNames(); } private static void lotNames() { String[] names = {"张三", "李四", "王五", "陈六", "苏七", "杨八"}; // 参加游戏的所有同学姓名 String[] lotNames = new String[1]; // 被抓阄抓到的人 // 循环抓人 Scanner input = new Scanner(System.in); System.out.println("开始游戏"); do { System.out.println("玩家名单:"); show(names); // 打印参赛者名单 System.out.print("游戏开始,点击回车,开始抓阄!"); input.nextLine(); // 获取回车键 // 产生随机数 int random = (int) (Math.random() * names.length); // 根据产生的随机数作为数组小标,找到被抓住的人 System.out.println(names[random] + "被抓住了。"); // lotNamesd的扩容 // 将被抓住的人移入lotNames lotNames[lotNames.length - 1] = names[random]; System.out.println("被抓住的名单:"); show(lotNames); String[] temp = new String[lotNames.length + 1]; for (int i = 0; i < lotNames.length; i++) { temp[i] = lotNames[i]; } lotNames = temp; // names的缩容 // 将被抓住的人移出names for (int i = random; i < names.length - 1; i++) { // 将被抓住的人后的人都往前移,覆盖掉被抓住的人的位置 names[i] = names[i + 1]; } temp = new String[names.length - 1]; for (int i = 0; i < temp.length; i++) { temp[i] = names[i]; } names = temp; temp = null; } while (names.length != 0); System.out.println("全部被抓住,游戏结束。"); } private static void show(String[] names) { for (String name : names) { System.out.print(name + "\t"); } System.out.println(); // 换行 } }
-
1.6 二维数组
1.6.1 定义
二维数组就是数组的数组。二维数组的定义跟一维数组类似,总体分为两类:
1.直接给每一维分配空间
-
type[][] typeName = new type[typeLength1][typeLength2];
-
type 可以为基本数据类型和复合数据类型,arraylength1 和 arraylength2 必须为正整数,arraylength1 为行数,arraylength2 为列数。
2.从最高维开始,分别为每一维分配空间,例如:
-
String s[][] = new String[2][]; s[0] = new String[2]; s[1] = new String[3]; s[0][0] = new String("Good"); s[0][1] = new String("Luck"); s[1][0] = new String("to"); s[1][1] = new String("you"); s[1][2] = new String("!");
1.6.2 行列互换
代码:
/**
* 二维数组行列互换
*
* @author SuMo
*
*/
public class ArrayAxis {
public static void main(String[] args) {
// 初始化二维数组
int[][] ints = new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
System.out.println("行列互换前:");
showArray(ints);
for (int i = 0; i < ints.length; i++) {
// 二维数组行列互换,只需要交换上三角与下三角即可
// 因此将 j 从 i + 1 开始进行循环,提高运算效率
for (int j = i + 1; j < ints[i].length; j++) {
// 使用中间变量进行交换
int temp = ints[i][j];
ints[i][j] = ints[j][i];
ints[j][i] = temp;
}
}
System.out.println("行列互换后:");
showArray(ints);
}
/**
* 打印输出数组
*
* @param ints
* 待打印输出的数组
*
*/
private static void showArray(int[][] ints) {
for (int i = 0; i < ints.length; i++) {
for (int j = 0; j < ints[i].length; j++) {
System.out.print(ints[i][j] + " ");
}
System.out.println(); // 打印完每行进行换行操作
}
}
}
结果:
2. 算法
2.1 冒泡排序
/**
* 冒泡排序
* 顺序:从小到大或者从大到小
*
* @author SuMo
*/
public class BubbleSort {
public static void main(String[] args) {
int[] num = {10, 15, 42, 56, 35, 84, 52, 34}; // 初始数据
int temp = 0; // 中间变量
// 排序前
System.out.println("排序前:");
for (int i = 0; i < num.length; i++) {
System.out.print(num[i] + "\t");
}
for (int i = 0; i < num.length - 1; i++) {
for (int j = 0; j < num.length - 1 - i; j++) {
// 二者二选一
if (num[j] > num[j + 1]) { // 下沉(从小到大)
temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
// if (num[j] < num[j + 1]) { // 上浮(从大到小)
// temp = num[j];
// num[j] = num[j + 1];
// num[j + 1] = temp;
}
}
}
// 排序后
System.out.println("\n排序后:");
for (int i = 0; i < num.length; i++) {
System.out.print(num[i] + "\t");
}
}
}
2.2 选择排序
/**
* 选择排序
*
* @author SuMo
*/
public class SelectSort {
public static void main(String[] args) {
int[] array = { 15, 54, 62, 32, 45, 58, 2, 99 }; // 初始数据
int temp = 0; // 中间变量
int currentIndex = 0; // 记录最小值的位置
// 排序前
System.out.println("排序前:");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + "\t");
}
for (int i = 0; i < array.length - 1; i++) {
currentIndex = i; // 初始化位置
for (int j = i + 1; j < array.length; j++) {
if (array[j] < array[currentIndex]) { // 通过比较,找出剩余数据中的最小值的位置
currentIndex = j;
}
}
if (i != currentIndex) { // 如果 i 不等于 currentIndex ,就需要进行位置交换
temp = array[i];
array[i] = array[currentIndex];
array[currentIndex] = temp;
}
}
// 排序后
System.out.println("\n排序后:");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + "\t");
}
}
}
2.3 二分查找
待查找的源数据必须有序且递增!!!
/**
* 二分查找(又称折半查找)
*
* @author SuMo
*/
public class BinarySearch {
public static void main(String[] args) {
int[] array = { 20, 25, 31, 45, 52, 63, 74, 85, 92, 97 };
binarySearch(0, array.length, 9, array);
}
/**
* 二分查找方法(递归)
*
* @param leftIndex
* 数组最小下标
* @param rightIndex
* 数组最大下标
* @param value
* 需要查找的数值
* @param array
* 待查找的数组(该数组必须是一个有序序列(从小到大))
*/
static void binarySearch(int leftIndex, int rightIndex, int value,
int[] array) {
int middleIndex = (leftIndex + rightIndex) / 2; // 中间下标
int middleValue = array[middleIndex]; // 中间值
if (leftIndex <= rightIndex) {
if (middleValue == value) { // 找到
System.out.println("成功找到该值:" + value + ",位置:" + middleIndex);
} else if (middleValue > value) { // 未找到,往左边走
binarySearch(leftIndex, middleIndex - 1, value, array);
} else { // 未找到,往右边走
binarySearch(middleIndex + 1, rightIndex, value, array);
}
} else {
System.out.println("未找到该值:" + value);
}
}
}
3. 初始调试(Debug)
断点:使程序暂停下来的地方
Eclipse:
- F5:进入方法(函数)内部
- F6:单步调试,一句一句的执行语句
- F7:跳出当前方法(函数)
- F8:多步调试,直接跳到下一个断点处
IDEA:
- F7:相当于 Eclipse 中的 F5
- F8:相当于 Eclipse 中的 F6
- Shift + F8:相当于 Eclipse 中的 F8,也相当于 Eclipse 中的 F7
认真、沉着做事,每天进步一小点!!!