Java数组的增删查改

      Java基础对每个程序员都非常重要,最近抽空开始复习Java基础部分,复习到数据结构与算法部分参考了美Robert Lafore的Java数据结构与算法第二版,收益匪浅。

故写下博客起到记录、监督自己继续学习的作用,同时也想与大家共同进步。

      Java数组是Java语言数据结构的最基本组成之一,我在参照网上资料和该书的前提下,写下如下Java数组的增删查改的代码。

      代码说明:1.以对象为基本元素,且本文的增删查改仅涉及单个数组元素,且为一维数组。

                          2.在数组中的特定位置插入特定值的算法参考了如下资料:Java数组的指定位置插入一个元素

                          3.第一次在CSDN上发博客,如代码有错误、不当或大家对实现算法有更好的看法,欢迎留言。

                          4.欢迎转载,请注明出处。

    
/**
 * 对象数组设计及相关方法测试
 * Created by Administrator on 2017/7/7.
 */

/**
 * 人的类,仅有名字和年龄字段。
 */
class Person{
    private String firstName;
    private String lastName;
    private int age;

    /**
     * 人类构造方法
     * @param first
     * @param last
     * @param a
     */
    public Person(String first,String last,int a){
        firstName = first;
        lastName = last;
        age = a;
    }
    /**
     * 对象元素显示方法,可用toString()方法代替
     */
    public void displayPerson(){
        System.out.println("firstName:"+firstName);
        System.out.println("lastName:"+lastName);
        System.out.println("age:"+age);
    }
    public String getLastName(){
        return lastName;
    }
    public String getFirstName(){
        return firstName;
    }
    public int getAge(){
        return age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", age=" + age +
                '}';
    }
}

/**
 * 存储人的类的对象数组,并可以进行增删查改(由于数组长度不可变,故增操作不可超过最大长度。)
 */
class DataArrayPerson{
    private Person[] a;//初始化数组
    int num;//元素下标

    /**
     * 对象数组构造方法
     * @param max
     */
    public DataArrayPerson(int max){//构造函数,仅初始化数组的最大元素容量
        a= new Person[max];
        num=0;
    }

    /**
     * 初始化插入
     * @param person
     */
    public void insert(Person person){//向数组中插入人对象
        a[num]=person;
        num++;
    }

    /**
     * 特定位置插入数组元素
     * 方法:构造第二个数组来移动插入元素后的所有元素
     * @param key , p
     */
    public int insertByKeyAndValue(int key, Person p){
//        System.out.println(a.length); //元素个数
        Person [] b = new Person[a.length+1];//由于要移动插入元素后的所有元素,故长度要加1
        if(key<0||key>=a.length){//判断当前插入位置的下标是否合法
            return -1;
        }else {
            for (int i = 0; i < a.length; i++) {
                b[i]=a[i];//将a数组的所有元素移到b数组,b数组空出最后一个位置
            }
            for (int i=key; i< b.length-1;i++){
                b[i+1]=a[i];//将报括从插入位置开始的原先的元素向后移,插入的位置空出
            }
            b[key]=p;//插入元素
            a=b;//还原
            return 1;
        }
}
    public void delete(String searchKey){//按数组-对象-关键字的方式找到值然后删除
        if (find(searchKey)==-1){
            System.out.println("此人不存在,无法删除!");
        }else{
            for (int j = find(searchKey); j < num; j++) {
                a[j]=a[j+1];
            }
            num--;
            System.out.println("删除指定对象后的数组为:");
            displayDataArray();
        }

    }
    public int find(String searchName){//按人的首名查询
        int i;
        for (i = 0; i < num; i++) {
            if (a[i].getFirstName().equals(searchName)){
                break;
            }
        }
        if (i==num){
            return -1;
        }
        return i;
    }

    /**
     * 打印数组
     */
    public void displayDataArray(){
        for (int i = 0; i < a.length; i++) {
            if (a[i]==null){
                continue;//当前元素为空则跳出当前循环
            }
            System.out.println("当前元素为:"+a[i]+",当前下标为:"+i);
        }
    }
}

/**
 * 测试类
 */
public class ClassDateApp {
    public static void main(String[] args) {
        Person p0 = new Person("li","bai",34);
        Person p1 = new Person("ma","bai0",34);
        Person p2 = new Person("zhao","bai1",34);
        Person p3 = new Person("sun","bai2",34);
        Person p4 = new Person("zhou","bai3",34);
        Person p5 = new Person("wu","bai4",34);
        Person p6 = new Person("xu","bai5",34);
        Person p7 = new Person("zhu","bai6",34);
        Person p8 = new Person("feng","bai7",34);
        Person p9 = new Person("chen","bai8",34);
        Person pt = new Person("ceshi","baice",35);
        Person pt1 = new Person("ceshi1","baice1",35);
        DataArrayPerson da = new DataArrayPerson(100);
        da.insert(p0);
        da.insert(p1);
        da.insert(p2);
        da.insert(p3);
        da.insert(p4);
        da.insert(p5);
        da.insert(p6);
        da.insert(p7);
        da.insert(p8);
        da.insert(p9);
        /**
        * 根据人的姓查找(也可根据其它方式查找,方法相同)
        */
        int findIndex=da.find("lao");
        if (findIndex==-1){
            System.out.println("此人不存在!");
        }else {
            System.out.println("此人存在且元素下标为:"+findIndex);
        }
        /**
         * 插入指定元素第一次测试
         */
       if (da.insertByKeyAndValue(4,pt)==-1){
           System.out.println("键值不合法!");
       }else {
           System.out.println("插入成功!新数组为:");
           da.displayDataArray();
       }
        /**
         * 插入指定元素第二次测试
         */
        if (da.insertByKeyAndValue(36,pt1)==-1){
            System.out.println("键值不合法!");
        }else {
            System.out.println("插入成功!新数组为:");
            da.displayDataArray();
        }
        /**
         * 删除方法测试
         */
        da.delete("xu");
 }

}

        从上述代码可以看出,由于无序数组在插入时不需要寻找特定位置,故无序数组的插入时间复杂度为O(1)。而其它如有序数组的插入、数组元素的删除时间复杂度都为O(N),因为它们都需要寻找特定位置且要移动过半以上的元素。

       其它与数组相关的算法时间复杂度总结:

         线性查找:O(N),二分查找O(logN)。

      



                
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值