题目概要

这次的目标略微简单些,是一道关于老师讲的题目。因为有了些其他的见解,做了些拓展。下面先亮一下题:

// 这是一个数列,请为数列扩容:
// {1,3,4,6}

基于当前的学习情况来讲,我没有学过任何类似于__Python__那种能直接__add元素__的方法,那么我要怎么做才能扩容呢?

答案很简单,只需要再 __创一个数组__,然后 嫁接 过去就可以了。(类似于数组=新数组,调用相同的内存地址,原先初始数组的赋值就被废弃了.)

但……这只是老师的想法啊……

我的思考

我的目标:实现数组的增删,且基于当下的条件,适时再引入一些其他的东西(毕竟学过其他语言,不能浪费了)。

整体思路如下:
0.创建一个初始数组

int arr_Initial = {1,3,4,6};

1.创建一个接收器,接收是要进行 增/删/阅读/退出 的哪一项:

import java.util.Scanner;
Scanner myScanner = Scanner(System.in);
// 打印出所有的数据
System.out.print("数组的原始数据为:");
for(int i=0;i<arr_Initial;i++){
System.out.print(arr_Initial[i]+" ");
}
// 从这个注释的地方开始,装个while(true){}囊括下面所有的代码,包括分支语句那部分
System.out.println("请问您要进行哪类操作?");
System.out.print("增/删/阅/退=>a/k/r/n :");
// 获取确定的选择
char chars = myScanner.next().charAt(0);
// 创建一个临时整形变量
int num;
// 创建一个临时整形变量,存储初始数组的大小.
int num_l = arr_Initial.length;
// 下面衔上分支语句

2.使用条件判断进行状态区分,总计有5个分支语句,如下:

if(chars=='a') {
// 增加数组的元素的模块
...
} else if (chars=='k') {
// 减少数组的元素的模块
...
} else if (chars=='r') {
// 读取初始数组元素的模块
System.out.println("当前数组的所有元素为:");
for(int i=0;i<num_l;i++){
System.out.print(arr_Initial+" ");
}
} else if (chars=='n') {
// 退出循环模的模块
System.out.print("退出当前循环!下列是当前数组的所有元素:");
for(int i=0;i<num_l;i++){
System.out.print(arr_Initial+" ");
}
break;
} else {
System.out.println("您的输入不符合条件,请重新输入!");
}

增模块与减模块较大,分别独立出来讲。

“增”模块

增模块的大体思路是:

1.获取要增加的数组有多少,赋值给 num.

System.out.print("请输入增加元素的个数:");
int num = myScanner.nextInt();

2.创建临时数组 __new_arr__,大小为初始数组大小+arr_Initial.length

int[] new_arr = new int[num+num_l];

3.按个读取初始数组的全部元素,按位赋值给临时数组。这样临时数组就具备了初始数组的所有元素,下一步可以 重塑 初始数组了。

for(int i=0;i<num_l;i++){
new_arr[i]=arr_Initial[i];
}

4.重塑初始数组的大小,只需要 new一下 就可以了,再使用for循环赋值回来就行了。这就是我理解的实质性的扩充数组的方式。

原本在这一步之前有一步arr_Initial=null的步骤的,观察其对结果没什么影响,故省略不计。

arr_Initial = new int[new_arr.length];
for(int i=0;new_arr.length;i++){
arr_Initial[i]=new_arr[i];
}
// 垃圾回收,免得占内存
new_arr = null;

5.接收新的数组元素,使用 __for循环接收__。

for(int i=0;i<num;i++) {
System.out.print("请输入要添加的第"+(i+1)+"个元素:");
arr_Initial[num_l+i] = myScanner.nextInt();
}

简单完成了 __“增”模块__,接下来处理下 __“减”模块__。

“减”模块

这个模块更简单,和增模块一样,有一个类似的 __减容模块__,下面具体实际操作下。

1.获取 降容数

System.out.println("注意!删除的方式是直接从数组末尾减去对应个数的元素!");
System.out.print("请输入删除元素的个数:");
num = myScanner.nextInt();

2.转换降容数,并且创建为 __临时数组__。

num = arr_Initial.length-num;
if(num<0) {
System.out.println("降容过低!拒绝降容!")
}
// 总容量-降容数=最终缩小容量
int[] del_arr = new int[num_l-num];

3.临时的数组复制初始数组的部分元素值,并且对初始数组降容。

for(int i=0;i<del_arr.length;i++) {
del_arr[i] = arr_Initial[i];
}
arr_Initial = new int[del_arr.length];

4.数组重塑降容后,将临时数组的值返还给初始数组,并且赋 null 准备回收。

for(int i=0;i<arr_Initial.length;i++){
arr_Initial[i]=del_arr[i];
}
del_arr = null;

合并

接下来,只需要稍做处理,将所有的代码 合并 即可。下面是合并的所有代码。

import java.util.Scanner;
public class word02 {
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
int[] arr_Initial = { 1, 3, 4, 6 };
// 打印出所有的数据
System.out.print("数组的原始数据为:");
for(int i = 0;i<arr_Initial.length;i++){
System.out.print(arr_Initial[i]+" ");
}
// 无限循环
int num;
while(true) {
System.out.println("请问您要进行哪类操作?");
System.out.print("增/删/阅/退=>a/k/r/n :");
// 获取确定的状态
char chars_yn = myScanner.next().charAt(0);
// 创建一个临时整形变量
int num_l = arr_Initial.length;
if (chars_yn=='a') {

// 增加数组的元素的模块
System.out.print("请输入增加元素的个数:");
num = myScanner.nextInt();
// 获取初始数组的大小
// int num_l = arr_Initial.length;
// 创建临时数组
int[] new_arr = new int[num+num_l];
// 复制初始数组到临时数组
for(int i=0;i<num_l;i++){
new_arr[i]=arr_Initial[i];
}
arr_Initial = new int[new_arr.length];
// 将临时数组值复制回去
for(int i=0;i<new_arr.length;i++){
arr_Initial[i]=new_arr[i];
}
// 垃圾回收,免得占内存
new_arr = null;
for(int i=0;i<num;i++) {
System.out.print("请输入要添加的第"+(i+1)+"个元素:");
arr_Initial[num_l+i] = myScanner.nextInt();
}
} else if(chars_yn=='k') {
// 减少数组的元素的模块
System.out.print("请输入需要减少的元素个数:");
// 获取数目:
num = myScanner.nextInt();
// 原始数组大小

// 计算大小是否合法
if(arr_Initial.length-num<0) {
System.out.println("降容过低!拒绝降容!");
continue;
}

// 总容量-降容数=最终缩小容量
int[] del_arr = new int[num_l-num];
// 复制部分初始数组元素
for(int i=0;i<del_arr.length;i++) {
del_arr[i] = arr_Initial[i];
}
// 格式化初始数组容量
arr_Initial = new int[del_arr.length];
// 将临时数组返还给初始数组
for(int i=0;i<arr_Initial.length;i++){
arr_Initial[i]=del_arr[i];
}
// 格式化清除
del_arr = null;
} else if (chars_yn=='r') {
// 读取初始数组元素的模块
System.out.println("当前数组的大小为:");
for(int i=0;i<arr_Initial.length;i++){
System.out.print(arr_Initial[i]+" ");
}
System.out.println("");
} else if (chars_yn=='n') {
// 退出循环模的模块
System.out.print("退出当前循环!下列是当前数组的所有元素:");
for(int i=0;i<arr_Initial.length;i++){
System.out.print(arr_Initial[i]+" ");
}
break;
} else {
System.out.println("您的输入不符合条件,请重新输入!");
}
}
}
}

整个的思维其实很简单,一小时不到就敲出来了.关键是家里一直吵吵嚷嚷的,很影响学习的效率(那响度啊,受不鸟受不鸟…算是被逼过来写博客了…正好把思路梳理下.).