数组的使用
一维数组的使用
1、 一维数组的声明和初始化
1.1 静态初始化:数组的初始化和数组元素的赋值操作 同时进行
1.2 动态初始化:数组的初始化 和 数字元素的赋值操作 分开进行
Tips:数组一旦初始化完成,长度就确定了
2、如何调用数组的指定位置的元素:通过角标的方式调用。
数组的角标(索引) 是从 零开始的,到数组的长度-1 结束。
3、如何获取数组长度
属性:length
4、如何遍历数组
利用循环
5、数组元素的默认初始值
数组元素没赋值的时候,也会有默认的初始值
默认值们:
>数组元素是整型:0
> 数组元素是浮点型:0.0
>数组元素是 char 类型:0 此零非’0’
>数组元素是 boolean 型: false
(最好记住)
>数组元素是引用数据类型:null
6、数组的内存解析
内存的一个简化机构
代码展示一下上面在讲什么
public class ArrayTest {
public static void main(String [] args){
//一维数组的声明和初始化
int [] ids; //声明
ids =new int[]{1,2,3,4,5}; //静态初始化 不同的元素用,隔开
String[] names= new String[5];//动态初始化
names[0]="John";
names[1]="Jackson";
names[3]="Kiki";
names[4]="Kera";
names[2]="Mike";
System.out.print(names.length); //调用 length函数来测 数组的长度
System.out.println();
//遍历整个数组
for(int i=0;i<names.length;i++){
System.out.println(names[i]);
}
}
}
小例子:从键盘键入 学生的成绩,找出最高分,并输出学生的成绩等级,成绩>=最高分-10 为 A;
成绩>=最高分-20 为 B;成绩>=最高分-30 为 C;其余的都是 D
import java.util.Scanner;
public class ArrayPractice {
public static void main(String [] args){
int studentNumber=0; //学生人数
System.out.println("Enter student number please:");
Scanner sc=new Scanner(System.in); //读入学生人数
studentNumber=sc.nextInt();
int[] studentGrades=new int[studentNumber]; //创建学生成绩数组
System.out.println("Enter student grades please:");
for(int i=0;i<studentNumber;i++){
studentGrades[i]=sc.nextInt();
} //依次读取学生成绩
int max=0; //最高成绩
for(int i=0;i<studentGrades.length;i++){
if(studentGrades[i]>max){
max=studentGrades[i];
}
} //找出最高成绩
System.out.println("最高分为"+max);
//根据题意 输出题目目标 也可以定义一个 level 表示成绩等级
for(int i=0;i<studentGrades.length;i++){
if(studentGrades[i]>=max-10){
System.out.println("第"+(i+1)+"同学成绩等级为 A");
}
else if(studentGrades[i]>=max-20){
System.out.println("第"+(i+1)+"同学成绩等级为 B");
}
else if(studentGrades[i]>=max-30){
System.out.println("第"+(i+1)+"同学成绩等级为 C");
}
else System.out.println("第"+(i+1)+"同学成绩等级为 D");
}
}
}
理清题目逻辑,这题目应该挺简单
3.3 多维数组的使用
二维数组居多
对于二维数组的理解,我们可以看作是一维数组 arry1 又作为另一个一维数组 arry2 的元素而存在
其实, 从数组的底层运行机制来看,其实没有多维数组
a. 二位数组的使用:
1、二维数组的声明和初始化
见如下代码 please
public class ArrayTest2 {
public static void main(String[] args){
//1、二维数组的声明和初始化
int [][] arr=new int[][]{{1,2,3},{2},{5,6,7}};//静态初始化
//动态初始化1
String[][] arr2=new String[3][2]; //3为 行数 2为列数
//动态初始化 2
String [][] arr3=new String[3][]; //列数可以不写 行数必须写 前面的[][]可以放在变量名后或者两边
}
}
2、如何调用数组的指定位置的元素
[][ ] 第一个行数 第二个表列数
3、如何获取数组的长度
arr.length 即 这个 arr 的行数 arr[0].length 求 这个第一行的列数
4、如何遍历数组
二维数组两层for 循环嵌套 三维数组即三层 for 循环 以此类推
假设有 arr[4] [5]数组
For(i=0;i<arr.length;i++)
for(int j=0;j<arr[i].length;j++)
5、数组元素的默认初始值
arr[] 初始值是 地址值
arr[]【】:初始值和上面的默认初始值一样
编程练习 杨辉三角
打印一个 10 行的杨辉三角
public class YangHuiTriangle {
public static void main(String[] args){
int [][] yanghui=new int [10][10]; //杨辉三角的数组
for(int i=0;i<10;i++){
for(int j=0;j<=i;j++){
if(i<2) {
yanghui[i][j] =1; //确定前两行
}
else if (j==0||j==i){
yanghui[i][j]=1; //确定第一个和最后一个
}else yanghui[i][j]=yanghui[i-1][j-1]+yanghui[i-1][j];
}
}
for(int i=0;i<10;i++){
for(int j=0;j<=i;j++){
System.out.print(yanghui[i][j]+"\t");
}
System.out.println();
}
}
}
这个算法是我自己写的,感觉逻辑挺简单的,但是代码有点冗余,同时数组也有内存空间的浪费;可以进行一定的优化。
优化一 省一部分内存空间
public class YangHuiTriangle {
public static void main(String[] args){
int [][] yanghui=new int [10][];
for(int i=0;i<10;i++){
yanghui[i]=new int[i+1]; //防止空指针的产生 这一步非常关键 值得反复品味
for(int j=0;j<=i;j++){
if(i<2) {
yanghui[i][j] =1;
}
else if (j==0||j==i){
yanghui[i][j]=1;
}else yanghui[i][j]=yanghui[i-1][j-1]+yanghui[i-1][j];
}
}
for(int i=0;i<10;i++){
for(int j=0;j<=i;j++){
System.out.print(yanghui[i][j]+"\t");
}
System.out.println();
}
}
}
优化二:减少代码量
public class YanghuiTrianglePro {
public static void main(String [] args){
int [][] yanghui=new int [10][];
for(int i=0;i<10;i++){
yanghui[i]=new int [i+1];
yanghui[i][0]=1; //保证每行第一个为1
yanghui[i][i]=1; //保证每行最后一个为 1
//此处的 if 可以不用写
if(i>1){
for(int j=1;j<yanghui[i].length-1;j++){
yanghui[i][j]=yanghui[i-1][j-1]+yanghui[i-1][j];
}
}
}
for(int i=0;i<10;i++){
for(int j=0;j<yanghui[i].length;j++){
System.out.print(yanghui[i][j]+"\t");
}
System.out.println();
}
}
}
3.4 数组中涉及到的常见算法
1、数组元素的赋值(杨辉三角、回形数等)
2、求数值型数组中元素的最大值、最小值、平均值、总和等
3、数组的复制、反转、查找(线性查找、二分查找)
4、数组元素的排序算法
总结
今日学习时间一般,不过认真敲了敲代码,也还算有点成就感,不过对于算法之后还需要好好努力,有很多地方非常菜,也算是还之前的债了。
今日发现一个贼好的免费的壁纸网站无广告放心使用
www.haowallpaper.com
革命尚未成功,同志仍需努力!!!