学习目标:
1、理解数组的定义与存储
2、掌握一维数组和几种简单排序操作
3、学习二维数组并掌握二维数组的基本操作
学习内容:
1、 数组的基本知识
2、 一维数组
3、 二维数组
数组
1、概述
- 数组是存储多个变量的容器。
- 存储的多个变量必须是同一种数据类型。
- 数组既可以存储基本数据类型,也可以存储引用数据类型。
- 数组中的每个元素都是由编号的,编号从0开始,到数组的长度减1结束,通过数组名和编号的配合就能取出数组中指定的元素,编号的专业称呼是索引。
- Java中的数组必须初始化之后才能够使用,初始化就是指的给数组中的元素分配内存空间,并赋值。
一维数组
声明方式
· 格式1:数据类型[] 数组名。
int[]arr
· 格式2:数据类型 数组名[]
int arr[]
赋值
静态赋值
int[]arr={1,2,3,4,5};//java规范使用数据类型[] 数组名
动态赋值
int arr[]=new int [5];
动静结合
int []arr=new int[]{
1,2,3,4,5;
}
数组排序操作
1、直接排序
算法思想
从待排序的元素集合中选取关键字最小的数据元素并将它与原始数据元素集合中的第一个数据元素交换位置;然后从不包括第一个位置的数据元素集合中选取关键字最小的数据元素并将它与原始数据集合中的第二个数据元素交换位置;如此重复,直到数据元素集合中只剩下一个数据元素为止
实例
int arr[] = { 5, 4, 3, 2, 1 };
int temp;
System.out.println(Arrays.toString(arr));
// 直接排序
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
选择排序
算法思想
首先找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素,那么它就和自己交换。如果只剩下最后一个元素,就没必要排了,它就是最大的)。再次在剩下的元素中找最小的元素,将它与数组中的第二个元素交换。如此往复,直到将整个数组排序
案例
int arr[] = { 5, 4, 3, 2, 1 };
for (int i = 0; i < arr.length; i++) {
int minindex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[minindex] > arr[j]) {
minindex = j;
}
}
int tem = arr[i];
arr[i] = arr[minindex];
arr[minindex] = tem;
}
System.out.println(Arrays.toString(arr));
冒泡排序
算法思想
每次冒泡排序操作都会将相邻的两个元素进行比较,看是否满足大小关系要求,如果不满足,就交换这两个相邻元素的次序,一次冒泡至少让一个元素移动到它应该排列的位置,重复N次,就完成了冒泡排序
案例
int arr[] = { 5, 4, 3, 2, 1 };
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] < arr[j + 1]) {
int te = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = te;
}
}
}
System.out.println(Arrays.toString(arr));
二维数组
在 Java 中二维数组被看作数组的数组,即二维数组为一个特殊的一维数组,其每个元素又是一个一维数组。Java 并不直接支持二维数组,但是允许定义数组元素是一维数组的一维数组,以达到同样的效果。
声明
动态声明
数据类型 数组名 [ ][ ] = new 数据类型[m][n]
数据类型 [ ][ ] 数组名 = new 数据类型[m][n]
数据类型 [ ] 数组名 [ ] = new 数据类型[m][n]
int arr[][]=new int[m][n];//n可定义也可不定义(n确定数组,m确定一维数组行数)
静态声明
数据类型 [ ][ ] 数组名 = {{元素1,元素2…},{元素1,元素2…},{元素1,元素2…}…};
int [][] arr=new int[][]{{4,5,6,8},{2,3},{1,6,9}};
案例1 将1-100的值赋给二维数组
int[][] aa = new int[10][10];
int k = 1;
for (int i = 0; i < aa.length; i++) {
for (int j = 0; j < aa[i].length; j++) {
aa[i][j] = k;
k++;
}
}
for (int i = 0; i < aa.length; i++) {
for (int j = 0; j < aa[i].length; j++) {
System.out.print(aa[i][j] + "\t");
}
System.out.println();
}
案例2 开关灯游戏的实现
int bb[][]={
{0,0,0,0,0,0},
{0,0,0,1,0,0},
{0,0,1,1,1,0},
{0,0,0,1,0,0},
{0,0,0,0,0,0}
};
Scanner sc=new Scanner(System.in);
int sun=0;
while(true){
for(int i=0;i<bb.length;i++){
for(int j=0;j<bb[i].length;j++){
System.out.print(bb[i][j]+" ");
}
System.out.println();
}
System.out.println("请输入您点击的行");
int r=sc.nextInt();
System.out.println("请输入您点击的列");
int c=sc.nextInt();
bb[r][c]=1-bb[r][c];
if(r-1>=0){
bb[r-1][c]=1-bb[r-1][c];
}
if(r+1<bb.length){
bb[r+1][c]=1-bb[r+1][c];
}
if(c-1>=0){
bb[r][c-1]=1-bb[r][c-1];
}
if(c+1<bb[r].length){
bb[r][c+1]=1-bb[r][c+1];
}
for(int i=0;i<bb.length;i++){
for(int j=0;j<bb[i].length;j++){
sun+=bb[i][j];
System.out.print(bb[i][j]+" ");
}
System.out.println();
}
if(sun==0){
break;
}
}
System.out.println("恭喜过关");