Day07-Java数组
数组
数组是相同类型数据的有序集合
数组定义
dataType [] arrayName = new dataType[arrayName.size]
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int [] a = new int[15]; //定义一个长度为15的整数数组
int [] b = new int[sc.nextInt()]; //定义一个通过输入决定长度的数组
int [] nums; //声明一个数组
nums = new int[10]; //创建一个数组
nums[0] = 1; //给元素赋值
Scanner.close();
}
}
数组内存分析
数组特点
- 长度确定。数组一旦创建,大小不可改变
- 数组元素必须相同,不允许混合类型
- 数组的元素可以是引用类型
- 数组可看成对象,每个元素相当于该对象的成员变量
- 数组保存在堆中
数组边界
下标的合法区间:[0,length-1]
ArrayIndexOutOfBoundsException:数组下标越界异常
数组使用
循环结合
查找最大元素
public class Main{
public static void main(String[] args){
int [] a = {1,2,3,4,5,2};
int max = a[0];
for(int i = 0;i<a.length;i++){
if (max<a[i]){
max = a[i];
}
}
}
}
增强型for循环
public class Main{
public static void main(String[] args){
for(int array:a){
System.out.println(a); //打印输出数组
}
}
}
反转数组
public class Main{
public static void main(String[] args){
int []a={1,2,3,4,5}
int []reserve=reserve(a);
printArray(reserve);
}
public static int [] reserve(int []array){ //定义一个数据类型为数组的方法
int []result = new int[array.length];
for(int i =0,j=result.length-1;i<array.length;i++,j--){
result[j]=array[i];
}
return result;
}
public static void printArray(int []array){ //定义一个打印数组的方法
for(int i =0;i<array.length;i++){
System.out.println(array[i])
}
}
}
多维数组
二维数组
public class Main{
public static void main(String[] args){
int [][]a=new int[2][5]; //定义一个两行五列的数组
int [][]b={{1,2},{1,3},{1,3}}; //定义了一个三行两列的二维数组
/*
1,2 b[0]
1,3 b[1]
1,3 b[2]
*/
printArray(b[0]); //此时输出的是1 ,2
printArray(b[0,0]); //此时输出的是1
System.out.println(b.length); //3
System.out.println(b[0].length);//2
}
public static void printArray(int []array){ //定义一个打印数组的方法
for(int i =0;i<array.length;i++){
System.out.println(array[i])
}
}
}
稀疏数组
当一个数组大部分元素为0,或者同一值时,可以使用稀疏数组来保存数据
方式:第[0]行写的是这个数组的行数和列数,还有存储的值的数量
数组中行列均以0开始,计算,如22即为第0行第三列的元素
public class ArraysTest {
public static void main(String[] args) {
int[][] a=new int [11][11]; //创建一个11行11列的数组来充当棋盘
a[2][4] = 1;
a[9][6] = 1; //改变某几个位置的值,充当落子效果
System.out.println();
for(int[] row: a){ //先将二维数组的每一行转化为1个数组
for(int col : row){ //将每一行对应的数输出
System.out.print(col+"\t");
}
System.out.println();
}
System.out.println("=========================================");
int sum=0; //计算棋盘中落子个数
for (int i = 0; i <11 ; i++) {
for (int j = 0; j <11 ; j++) {
if(a[i][j]!=0){
sum++;
}
}
}
System.out.println("落子个数:"+sum);
int[][] b =new int[sum+1][3];
int count = 0; //count用来判断是从哪一行开始添加稀疏数组的元素
/*
创建一个稀疏数组,固定为三列,第一列为存放落子位置的横坐标,第二列存放落子位置的列坐标
数组表头需要来存放原数组行数列数和落子个数,行数需要比落子个数加1
*/
b[0][0] =11; //一共11行
b[0][1] =11; //一共11列
b[0][2] =sum; //一共落子数量
for (int i = 0; i <a.length ; i++) { //二维数组使用length时默认输出的是行数
for (int j = 0; j <a[i].length ; j++) { //a[i]是行,每一行都包含一个一维数组为列,循环遍历
if(a[i][j]!=0){
count++; //因为第一行已经被行列值个数占据,所以从第二行开始
b[count][0]=i; //存放行
b[count][1]=j; //存放列
b[count][2]=a[i][j]; //存放值
}
}
}
//输出稀疏数组
for(int c[]:b){
for(int d:c){
System.out.print(d+"\t");
}
System.out.println();
}
System.out.println("=========================================");
//还原稀疏数组
int[][] e = new int[b[0][0]][b[0][1]]; //稀疏素组第一行的前两个元素代表行列\
//将落子位置赋值为棋盘
for (int i = 1; i <b.length ; i++) {
e[b[i][0]][b[i][1]]=b[i][2];
}
//将棋盘打印输出
for(int[] row: e){ //先将二维数组的每一行转化为1个数组
for(int col : row){ //将每一行对应的数输出
System.out.print(col+"\t");
}
System.out.println();
}
}
}