数组操作常见的问题:
java.lang.ArrayIndexOutOfBoundsException: 5 :数组越界异常
原因:找不到一个为5的索引。
java.lang.NullPointerException:空指针异常
原因:该数组肯定已经不再指向堆内存,或者访问了一个为空的数组。
1.获取数组的最大值
分析:
a.定义一个数组
b.从数组中任意找一个元素作为参照物,我们选择第一个元素,默认他是最大的
c.然后遍历该数组的所有元素,每遍历一次,我就和参照物进行对比
d.如果大于参照物,就取代参照物,否则不用管
e.然后一直到最后,参照物的值就是最大值
代码:
public static int ArrayMax(int[] arr) {
//默认找第一个元素作为参照物(假设最大值)
int max = arr[0];
//遍历所有元素
for (int i = 0; i < arr.length; i++) {
//每遍历一次,我就和参照物进行对比
if(arr[i] > max) {
//替换参照物
max= arr[i];
}
}
return max;
}
2.将元素逆序
分析:
a.定义一个数组
b.思路:
把数组索引为0的和数组索引为arr.length-1的数据进行交换
把数组索引为1的和数组索引为arr.length-2的数据进行交换
…
我们交换的次数arr.length/2
代码:
public static void main(String[] args) {
int [] arr=new int[] {1,2,5,7,9,3};
System.out.println("逆序前:"+Arrays.toString(arr));
for (int i =0; i < arr.length/2; i++) {//因为逆序只需要查找一半 所以;arr.length/2
//将第一个数和最后一个数进行交换 依次类推
//将第一个数存在临时变量
int temp = arr[i];
//将最后一个数赋值给第一个数
arr[i] = arr[arr.length-i-1];
//将会临时变量的数(第一个数)赋值给最后一个数
arr[arr.length-i-1] = temp;
}
System.out.println("逆序后:"+Arrays.toString(arr));
}
3.数组元素查找,查找该元素在数组中第一次出现的索引编号是多少
代码:
for (int i = 0; i < arr.length; i++) {
if(932 == arr[i]) {
System.out.println("第"+i+"个索引号");
}
}
4.将数组中的重复元素进行清除(去重),并且把非重复的元素存入到一个新数组并返回,而且不能浪费长度
代码:
public static void main(String[] args) {
int [] oldArr = {15,56,151,515,518,588,58,18,18,18,18,8,85,18,28,15};
//记录有多少个重复元素
int count = 0;
//计算重复元素的个数 oldArr.length-1是不计算后面的最后一次循环,提高效率(最重要的,防止数组越界)
for (int i = 0; i < oldArr.length-1; i++) {
for (int j = i+1; j < oldArr.length; j++) {
if(oldArr[i] == oldArr[j]) {
count++;
break;
}
}
}
//创建一个新的数组
int [] newArray = new int[oldArr.length-count];
int index = 0;
for (int i = 0; i < oldArr.length; i++) {
boolean flag = false;//该标识是用于识别取出的元素是否存在新的数组当中,false表示不存在
int temp = oldArr[i]; //从旧的数组当中取出所遍历的元素
for (int j = 0; j < newArray.length; j++) {
if(newArray[j] == temp) {
flag = true;
break;
}
}
//如果该元素不在新数组当中,存起来
if(flag == false) {
newArray[index++] = temp;
}
}
System.out.println(Arrays.toString(oldArr)+"---"+newArray.length);
System.out.println(Arrays.toString(newArray)+"---"+newArray.length);
}
}
5.Java冒泡排序算法
代码:
public static void main(String[] args) {
int []arr = {15,156,51,5658,218,18,18,18,8};
System.out.println("排序前"+Arrays.toString(arr));
//外层
// arr.length-1 是为了防止数组越界
// arr.length-1-i 为了减少比较的次数
for(int x = 0;x < arr.length-1;x++) {
for (int i = 0; i < arr.length-1-x; i++) {
if(arr[i] < arr[i+1]) {
//相比较的数,如果符合条件进行交换
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
System.out.println("结果3:"+Arrays.toString(arr));
}
}
5.数组工具类使用
public static void main(String[] args) {
int [] arr = {15,561,81,15186,568,1861,61,5,14};
//数组工具类之数组打印
//public static String toString(int[]a);
String str = Arrays.toString(arr);
System.out.println(str);
//数组工具类之数组排序
//public static void sort(int[]a);
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
6. 二维数组:就是其元素为一维数组的数组
格式:
数据类型[][] 数组名 = new int[m][n];
m:表示这个二维数组里面有多少个一维数组
n:表示每一个一维数组里面有多少个元素值
注意:
1.以下格式也能够定义二维数组:
a.数据类型 数组名[][] = new 数据类型[m][n];
b.数据类型[]数组名[] = new 数据类型[m][n];
2.注意以下格式:
int [] x;//√
int [] y [];//√
int []x,y[];//√
格式2:
int [][] arr = new int [m][];
m:表示这个二维数组里面有m个一维数组
但是没有给出每个一维数组里面有多少个元素(没有为一维数组分配空间)
二维数组的静态初始:
基本格式:
数据类型[][] 数组名 = new 数据类型[][]{{元素1},{元素1,元素2},{元素1,元素2}};
简化格式:
数据类型[][] 数组名 = {{元素1},{元素1,元素2},{元素1,元素2}};
举例:
//错误写法 不要静态和动态混合
int [][] arr = new int [4][5]{{元素1},{元素1,元素2},{元素1,元素2}};