用对象数组模仿ArrayList的部分功能

2020-05-05  本文已影响0人  邪恶的正派

多年前写过的一个demo,仅供参考,如有不正确,望多谅解!具体代码如下:

public class MyArrayList {
    // 1.定义一个对象数组并且初始化长度为10
    public Object myArrayList[] = new Object[10];
    
    // 2.创建方法
    /*************************************************/
    /*************************************************/
    //第一:添加的方法,根据具体元素添加
    /**
     * 添加元素的方法
     * @param e 添加的数据
     */
    public void add(Object e) {
        int index = -1;     //用于记录插入数据在数组中的位置
        for (int i = 0; i < myArrayList.length; i++) {
            //如果数组中有空的位置,那么可以向数组中添加数据
            if(myArrayList[i] == null){
                index = i;
                break;
            }
        }
        //当数组还没满,可以向数组中添加数据
        if(index != -1){
            myArrayList[index] = e;
        }else {
            // 该数组用于数组动态增长
            Object newMyArrayList[] = new Object[myArrayList.length+myArrayList.length/2];
            //将数组中的值复制到新数组中
            for (int i = 0; i < myArrayList.length; i++) {
                newMyArrayList[i] = myArrayList[i];
            }
            //将数组放在新数组中空的位置
            for (int i = 0; i < newMyArrayList.length; i++) {
                if(newMyArrayList[i] == null){
                    newMyArrayList[i] = e;
                    break;
                }
            }
            //数组关联
            myArrayList = newMyArrayList;
        }
    }

    
    /*************************************************/
    /*************************************************/
    // 第二:根据下标值往数组里添加
    /**
     * 根据指定下标值往数组里添加元素
     * @param index 下标值
     * @param e 具体的元素
     */
    public void add(int index,Object e) throws IndexOutOfBoundsException {
        if(index < size()){ 
            //元素后移
            for (int i = myArrayList.length-1; i > index; i--) {
                myArrayList[i] = myArrayList[i-1];
            }
            myArrayList[index] = e;
        }else{
            throw new IndexOutOfBoundsException("Index: " + index + ",Size: " + size());
        }
    }
    
    
    /*************************************************/
    /*************************************************/
    // 第三:移除数组中元素
    /**
     * 移除元素的方法
     * @param e 移除的元素
     */
    public void remove(Object e) {
        int index = -1;       //要删除元素的下标值
        for (int i = 0; i < myArrayList.length; i++) {
            if(myArrayList[i] != null && myArrayList[i] == e){
                index = i;
            }
        }
        //如果删除的是数组最后一位,那位置不用移动
        if(index == myArrayList.length -1){
            myArrayList[index] = null;
        }else if(index == -1){
            
        }else{
            //定义一个新的数组用来保存删除过后的元素
            Object[] newArrayList = new Object[myArrayList.length];
            /**
             * 如果删除的位置在中间某个元素,那么在index之前的元素不用移动位置
             * 在index后的元素需要移动位置
             */
            for (int i = 0; i < myArrayList.length; i++) {
                if (i < index) {
                    newArrayList[i] = myArrayList[i];
                }
                if (i > index) {
                    newArrayList[i - 1] = myArrayList[i];
                }
            }
            //关联
            myArrayList = newArrayList;
        }
    }
    
    
    /*************************************************/
    /*************************************************/
    // 第四:查找指定下标元素
    /**
     * 查找指定下标元素
     * @param index 指定下标值
     * @return 指定元素
     */
    public Object get(int index) throws IndexOutOfBoundsException {
        Object object = null;
        if(index < size()){
            for (int i = 0; i < myArrayList.length; i++) {
                if(myArrayList[index] == myArrayList[i]){
                    object = myArrayList[i];
                    break;
                }
            }
        }else{
            throw new IndexOutOfBoundsException("Index: " + index + ",Size: " + size());
        }
        return object;
    }

    
    /***************************************************************/
    /***************************************************************/
    /**
     * 返回数组中非空元素个数
     * @return 有效元素个数
     */
    public int size() {
        int num = 0;
        for (int i = 0; i < myArrayList.length; i++) {
            if(myArrayList[i] != null){
                num++;
            }
        }
        return num;
    }
    
}

测试功能类:

public class MyArrayListTest {
    public static void main(String[] args) {
        // 1.创建4个企鹅对象
        Pet pet1 = new Penguin("楠楠", "Q妹");
        Pet pet2 = new Penguin("男男", "Q仔");
        Pet pet3 = new Penguin("花花","Q妹");
        Pet pet4 = new Penguin("华华", "Q仔");
        //创建MyArrayList对象
        MyArrayList myArrayList = new MyArrayList();
        // 2.创建ArrayList并且将4个企鹅对象放入其中
        myArrayList.add(pet1);
        myArrayList.add(pet2);
        myArrayList.add(pet3);
        myArrayList.add(1,pet4);
        // 3.查看企鹅数量
        System.out.println("共有企鹅" + myArrayList.size() + "只.");
        // 4.遍历所有企鹅
        System.out.println("分别是:");
        for (int i = 0; i < myArrayList.size(); i++) {
            Penguin penguin = (Penguin)myArrayList.get(i);
            penguin.print();
        }
        // 5.删除集合中部分元素
        myArrayList.remove(0);
        myArrayList.remove(pet3);
        // 6.显示删除后的信息
        System.out.println("\n删除之后还有企鹅" + myArrayList.size() + "只.");

        System.out.println("分别是:");
        for (int i = 0; i < myArrayList.size(); i++) {
            Penguin penguin = (Penguin)myArrayList.get(i);
            penguin.print();
        }
//      myArrayList.add("a");
//      myArrayList.add("b");
//      myArrayList.add("c");
//      myArrayList.add("d");
//      myArrayList.add("e");
//      myArrayList.add("f");
//      myArrayList.add("g");
//      myArrayList.add("h");
//      myArrayList.add("i");
//      myArrayList.add("j");
//      myArrayList.add("k");
//      myArrayList.add("l");
//      myArrayList.add(10, "可以吗");
//      System.out.println("集合中共有元素个数:"+myArrayList.size());
//      System.out.println("删除以前,共有元素:");
//      for (int i = 0; i < myArrayList.size(); i++) {
//          System.out.print(myArrayList.get(i) + "\t");
//      }
//      System.out.println();
//      System.out.println("删除一个元素");
//      myArrayList.remove("k");
//      System.out.println();
//      System.out.println("集合中共有元素个数:"+myArrayList.size());
//      System.out.println("删除之后的元素:");
//      for (int i = 0; i < myArrayList.size(); i++) {
//          System.out.print(myArrayList.get(i) + "\t");
//      }
    }
}

另附对象类,抽象宠物类

/**
 * 
 * @功能: 描述宠物的信息
 * @作者:   
 * @时间:2014-4-27
 * @地点: 
 * @Version 1.0
 */

public abstract class Pet {
    // 1.定义属性
    private String name;          //昵称
    private int health = 100;    //健康值
    private int love;            //亲密度
    
    // 2.建构造器
    // 获取昵称
    public String getName() {
        return name;
    }
    /**
     * 设置昵称
     * @param name
     */
    public void setName(String name){
        this.name = name;
    }
    // 获取健康值
    public int getHealth() {
        return health;
    }
    /**
     * 设置健康值
     * @param health
     */
    public void setHealth(int health){
        this.health = health;
    }
    // 获取亲密度
    public int getLove() {
        return love;
    }
    /**
     * 设置亲密度
     * @param love
     */
    public void setLove(int love){
        this.love = love;
    }
    
    // 3.构造函数
    /**
     * 无参的构造方法
     */
    public Pet(){
        
    }
    /**
     * 带参的构造方法
     * @param name
     */
    public Pet(String name ){
        this.name = name;
    }
    
    // 4.创建方法
    /**
     * 创建宠物吃的抽象方法
     */
    public abstract void eat();
    
    /**
     * 显示宠物信息的方法
     */
    public abstract void print();
}

继承宠物类,重写父类方法

/**
 * 
 * @功能: 描述企鹅的信息
 * @作者:    
 * @时间:2014-4-27
 * @地点: 
 * @Version 1.0
 */
public class Penguin extends Pet{
    // 1.定义属性
    private String sex;     //性别
    /**
     * 获取性别
     * @return
     */
    public String getSex() {
        return sex;
    }
    /**
     * 设置性别
     * @param sex
     */
    public void setSex(String sex) {
        this.sex = sex;
    }
    private String id;  //编号
    /**
     * 获取编号
     * @return 编号
     */
    public String getId() {
        return id;
    }
    /**
     * 设置编号
     * @param id 编号
     */
    public void setId(String id) {
        this.id = id;
    }
    // 2.构造函数
    /**
     * 无参的构造函数
     */
    public Penguin() {
    }
    /**
     * 带参的构造方法
     * @param name 名字
     * @param sex 性别
     */
    public Penguin(String name,String sex){
        super(name);
        this.sex = sex;
    }
    /**
     * 三个参数的带参构造方法
     * @param id 编号
     * @param name 名字
     * @param sex 性别
     */
    public Penguin(String id,String name,String sex){
        super(name);
        this.id = id;
        this.sex = sex;
    }
    @Override
    /**
     * 重写父类方法,实现企鹅吃的方法
     */
    public void eat() {
        if(getHealth() >= 100){
            System.out.println("企鹅"+ getName() + "吃饱了!" );
        }else{
            setHealth(getHealth()+4);
            System.out.println("企鹅"+ getName() + "吃饱了!健康值加4。" );
        }
    }
    /**
     * 企鹅游泳的方法
     */
    public void swimming(){
        System.out.println("企鹅" + getName()+"正在游泳!");
        setHealth(getHealth()-10); //健康值减少10
        setLove(getLove() + 5);    // 亲密度增加5
    }
    /**
     * 重写父类方法,显示企鹅信息的方法
     */
    public void print(){
        System.out.println(super.getName() + "\t" + this.getSex());
    }
    
}
上一篇下一篇

猜你喜欢

热点阅读