Java 对数组进行增、删、查操作

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,如果删除更多字符时容易造成数据冗余。
在这里插入图片描述
改进方案:使用循环语句,将非空的数据依次存储到新的数组中,再将其赋值给原来的数组。
在这里插入图片描述
运行结果:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值