20220716_第七小组_张红睿_学习笔记
Java基础第四天
概述:数组的常用操作
1. 掌握
1.1 数组常用操作
1.1.1 判断输入数组下标合法性
算法:数组下标需要在数组的范围内,即0~length。
核心代码:
if(index >= 0 && index < arr.length)
测试代码:
int[] arr = new int[]{ 4, 58, 69, 14, 22, -1};
Scanner sc = new Scanner(System.in);
int index = sc.nextInt();
if(index >= 0 && index < arr.length)
System.out.println("数据为" + arr[index]);
else
System.out.println("输入下标不合法");
测试结果:
1.1.2 数组的倒序输入
算法:在循环中通过累加的变量"i"联合数组长度进行动态的赋值。
核心代码:
arr[arr.length - i - 1] = input;
测试代码:
int[] arr = new int[5];
Scanner sc = new Scanner(System.in);
System.out.println("请输入要插入数组的数据,用空格隔开: ");
for(int i = 0; i < arr.length; i++){
int input = sc.nextInt();
arr[arr.length - i - 1] = input; // 核心代码
}
System.out.println("数组内容为: " + Arrays.toString(arr));
测试结果:
1.1.3 数组的扩容
算法:创建一个临时数组,申请比原数组大的内存,再赋值。
核心代码:
int[] tmpArr = new int[arr.length + 5];
for(int i = 0; i < arr.length; i++)
tmpArr[i] = arr[i];
arr = tmpArr;
测试代码:
int[] arr = new int[]{1, 2, 3, 4, 5};
System.out.println("扩容前的数组为: " + Arrays.toString(arr));
System.out.println("扩容前的数组长度: " + arr.length);
int[] tmpArr = new int[arr.length + 5];
for(int i = 0; i < arr.length; i++){
tmpArr[i] = arr[i];
}
arr = tmpArr;
System.out.println("扩容后的数组为: " + Arrays.toString(arr));
System.out.println("扩容后的数组长度: " + arr.length);
测试结果:
1.1.4 数组的移位
算法:在循环中根据自加的i值和长度进行联合,找到其中的规律。
核心代码:
arr[arr.length - 1 - i] = arr[arr.length - 2 - i];
测试代码:
int[] arr = new int[]{1, 2, 3, 4, 5, 0, 0};
System.out.println("移位前的数组: " + Arrays.toString(arr));
for(int i = 0; i < arr.length - 1; i++){
arr[arr.length - 1 - i] = arr[arr.length - 2 - i];
}
arr[0] = 0;
System.out.println("移位后的数组: " + Arrays.toString(arr));
测试结果:
1.1.5 在数组的指定位置拼接另一个数组
算法:定义要拼接的两个数组长度之和的临时数组,循环遍历依据要插入位置的下标进行规律分析。
- 当遍历下标i值小于插入位置index时,将对应的被插入数组赋值到临时数组中;
- 当遍历下标i值小于index与数组2长度之和时,将插入的数组赋值到临时数组中;
- 将剩余的数组1后面的元素赋值到临时数组中。
核心代码:
int[] tmpArr = new int[arr1.length + arr2.length];
for (int i = 0; i < tmpArr.length; i++) {
if (i < index)
tmpArr[i] = arr1[i];
else if(i < index + arr2.length){
tmpArr[i] = arr2[i - index];
}else{
tmpArr[i] = arr1[i - arr2.length];
}
}
测试代码:
/**
* 在一个数组的指定位置拼接另一个数组
* @param arr1 被插入目标数组
* @param arr2 要插入数组
* @param index 目标数组中的位置
* @return 拼接后的数组
*/
private static int[] mergeArray(int[] arr1, int[] arr2, int index){
int[] tmpArr = new int[arr1.length + arr2.length];
for (int i = 0; i < tmpArr.length; i++) {
if (i < index)
tmpArr[i] = arr1[i];
else if(i < index + arr2.length){
tmpArr[i] = arr2[i - index];
}else{
tmpArr[i] = arr1[i - arr2.length];
}
}
return tmpArr;
}
public static void main(String[] args) {
int[] arr1 = new int[]{1, 2, 3, 4, 5};
int[] arr2 = new int[]{999};
System.out.println("拼接前的数组为: " + Arrays.toString(arr1) + Arrays.toString(arr2));
System.out.println("在第一个数组的第二个位置插入第二个数组: ");
System.out.println("拼接后的数组为: " + Arrays.toString(mergeArray(arr1, arr2, 2)));
}
测试结果:
2. 案例
2.1 两个数组每个元素的拼接
算法:依据两个数组长度进行循环嵌套,内部拼接两数组各元素再输出。
源代码:
private static void test2(){
String[] str1 = new String[]{"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
String[] str2 = new String[]{"黑桃", "红桃", "梅花", "方片"};
for (int i = 0; i < str2.length; i++) {
for (int j = 0; j < str1.length; j++) {
System.out.print(str2[i] + str1[j] + " ");
}
System.out.println();
}
}
输出结果:
2.2 平均分统计
算法:算出平均分,然后循环每一个分数,进行其余平均分的比较,大于平均分则进行自加操作。
源代码:
private static void test4(){
int[] scores = new int[]{95, 92, 75, 56, 98, 71, 80, 58, 91, 91};
int avg = getAvg(scores);
int count = 0;
for (int i = 0; i < scores.length;i++) {
if(scores[i] > avg)
count++;
}
System.out.println("原分数为: " + Arrays.toString(scores));
System.out.println("高于平均分: " + avg + " 的个数有 " + count + " 个。");
}
private static int getAvg(int[] scores){
int sum = 0;
for (int i = 0; i < scores.length; i++) {
sum += scores[i];
}
return sum / scores.length;
}
输出结果:
2.3 对称数组
算法:循环遍历数组每个元素,依次判断头尾两个元素值是否一致。
核心代码:
if (arr[i] != arr[arr.length - i - 1])
源代码:
private static void test5(){
int[] arr1 = new int[]{1, 2, 3, 4, 3, 2, 1};
int[] arr2 = new int[]{1, 2, 3, 4, 5, 2, 1};
System.out.println(Arrays.toString(arr1) + "是否对称: " + sym(arr1));
System.out.println(Arrays.toString(arr2) + "是否对称: " + sym(arr2));
}
private static boolean sym(int[] arr){
for (int i = 0; i <= (arr.length - 1)/2; i++) {
if (arr[i] != arr[arr.length - i - 1])
return false;
}
return true;
}
2.4 统计字符个数
源代码:
点击查看代码
private static void test7(){
char[] charArr = new char[]{'a','l','f','m','f','o','b','b','s','n'};
char[] charArrNoRepeat = new char[0];
boolean isAdd = true;
for (int i = 0; i < charArr.length; i++) {
while (isAdd) {
char[] tmp = new char[charArrNoRepeat.length + 1];
for (int j = 0; j < charArrNoRepeat.length; j++) {
tmp[j] = charArrNoRepeat[j];
}
charArrNoRepeat = tmp;
isAdd = false;
}
for (int j = 0; j < charArrNoRepeat.length; j++) {
if (charArrNoRepeat[j] == '\u0000') {
charArrNoRepeat[j] = charArr[i];
isAdd = true;
break;
}
if (charArr[i] == charArrNoRepeat[j]) {
isAdd = false;
break;
}
}
}
for (int i = 0; i < charArrNoRepeat.length; i++) {
int count = printCount(charArr, charArrNoRepeat[i]);
System.out.println(charArrNoRepeat[i] + "--" + count);
}
}
private static int printCount(char[] charArr, char ch){
int counts = 0;
for (int i = 0; i < charArr.length; i++) {
if(charArr[i] == ch)
counts++;
}
return counts;
}
输出结果: