JAVA 对数组的操作问题
1.问题描述
对数组进行添加、删除和查询操作

1.问题描述
不同的操作可以使用不同的数字进入,使用条件语句if-else if…-else语句实现不同功能的选择,调用MyList类中的相关方法实现不同功能。
在MyList类中,属性有Object[] element;方法size()返回数组的有效长度,方法add(String s)用于在数组末端添加数据s,方法remove()用于删除数据,通过重写方法实现根据数据或者下标删除数据,方法get()通过下标获取对应的数据。
方法add()可以通过创建新数组实现动态扩容,将原数组中的数据依次存放在新数组中,然后在其后添加新数据,最后将新数组赋值给原来数组实现动态扩容。
方法remove()根据下标删除数据,可以使用element[i]=element[i+1];的方式实现,在对应下标后的数据依次前移,再将数组最后一位置为null即可。方法remove()根据数据删除数据,使用循环语句依次遍历数组,当遇到与要删除数据相同的数据时,置为null。
3.实现代码
Demo3_2类
/***
* 2021-02-10
*/
import java.util.Arrays;
import java.util.Scanner;
public class Demo3_2 {
public static void main(String[] args) {
MyList list = new MyList();//创建实例对象
//读取数组的初始数据
System.out.println("请输入几个数并用逗号隔开:");
Scanner sc = new Scanner(System.in);
String str = sc.next().toString();
String[] arr = str.split(",");//输入的字符串中,以逗号为分隔符,将字符串放入数组arr
list.element = new Object[arr.length];//初始化MyList中的element属性
for(int i = 0; i<arr.length;i++) {
list.element[i] = arr[i];//将输入的字符存储依次存储到element数组中
}
System.out.println("初始数组为:"+Arrays.toString(list.element));
while(true){
System.out.println("请输入要进行的操作:1-增加数据,2-根据数据删除,3-根据下标删除,4-查询数据,输入其他数字-退出");
int i = sc.nextInt();
if (i == 1){
System.out.print("输入要添加的字符:");
String s = sc.next();
list.add(s);
}
else if(i == 2){
System.out.print("输入要删除的字符:");
String s = sc.next();
list.remove(s);
}
else if(i == 3){
System.out.print("输入要删除字符的下标:");
int j = sc.nextInt();
list.remove(j);
}
else if(i == 4){
System.out.print("输入要查询下标:");
int j = sc.nextInt();
list.get(j);
} else{
break;
}
}
}
}
MyList类
import java.util.Arrays;
public class MyList {
Object[] element;
//获取当前存储的有效数据长度
int size(){
int l = 0; //用于存储有效长度
for(int i = 0;i < element.length;i++){
if(element[i] != null){
l++;
}
}
return l;
}
//将输入的数据存储在数组的末端
void add(String s){
//创建新数组,用于将原内容复制到新的大数组中
Object[] newElement = new Object[element.length+1];
for(int i = 0;i < size();i++){
newElement[i] = element[i];
}
newElement[size()] = s;//将添加的字符加在数组最后
element = newElement;//将更新后的数组赋值给原数组
System.out.println("添加后的数组为:"+Arrays.toString(element));
}
//根据数据从数组属性中删除数据
void remove(String s){
for(int i = 0;i < size();i++){
if(element[i].equals(s)){
element[i] = null; //将满足条件的字符全部置为null
}
}
Object[] newElement = new Object[size()];
for(int i = 0,j = 0;i < element.length;i++){
if(element[i] != null){ //将非null字符存储到新的数组newElement中
newElement[j] = element[i];
j++;
}
}
element = newElement;//将更新后的数组赋值给原数组
System.out.println("删除后的数组为:"+Arrays.toString(element));
}
//根据下标从数组属性中删除数据
void remove(int i){
Object[] newElement = new Object[element.length-1];
for(int j = 0;j < i;j++){
newElement[j] = element[j];
}
for(int j = i;j < size()-1;j++){
newElement[j] = element[j+1];
}
element = newElement;//将更新后的数组赋值给原数组
/*for(int j = 0;j < size();j++){
element[j] = element[j+1];
}
element[size()] = null;*/
System.out.println("删除后的数组为:"+Arrays.toString(element));
}
//返回指定下标的数据
void get(int i){
System.out.println("数组下标为"+i+",对应的字符为"+element[i]);
}
}
4.遇到的问题
(1)数组下标越界问题
解决方案:将size()改成size()-1即可。
5.进一步完善
在将如上的bug更改后,实现结果如下,出现数组最后的字符为null,如果删除更多字符时容易造成数据冗余。

改进方案:使用循环语句,将非空的数据依次存储到新的数组中,再将其赋值给原来的数组。

运行结果:
