用顺序存储(数组)方式来实现列表

 

1.添加方法要扩容,数组是没有扩容机制的。

2.删除方法要重新排元素,将后面的元素向前推。

 

 

复制代码
package demo1;
/**
 * 线性表(列表)的接口
 * @author DeepSleeping
 *
 */
public interface MyList {

    /*新增一个元素*/
    void add(Object element);
    /*删除相同元素*/
    void delete(Object element);
    /*根据索引删除元素*/
    void delete(int index);
    /*将指定索引位置的元素替换成新元素*/
    void update(int index,Object newElement);
    /*当前列表中是否含有target这个元素*/
    boolean contains(Object target);
    /*返回指定索引处的元素*/
    Object at(int index);
    /*查找element的索引,如果没有返回-1*/
    int indexOf(Object element);
    
}
复制代码
复制代码
package demo1;

/**
 * 用顺序存储(数组)方式来实现列表
 * 
 * @author DeepSleeping
 *
 */
public class MyArrayList implements MyList {

    private Object[] elements;// 真正存储元素的底层结构
    private int size = 0;// 元素的个数
    private int capacity = 10;// 容量

    public MyArrayList(int capacity) {
        this.capacity = capacity;
        elements = new Object[capacity];
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < size; i++) {
            sb.append(elements[i] + (i == size - 1 ? "" : ","));
        }
        sb.append("]");
        return sb.toString();
    }

    public MyArrayList() {
        elements = new Object[capacity];
    }

    /**
     * 新增一个元素
     * @param element
     */
    @Override
    public void add(Object element) {
        if (size == capacity) { // 扩容
            capacity *= 2; // 增加一倍的容量
            Object[] newArr = new Object[capacity];// 新建一个数组
            for (int i = 0; i < size; i++) {
                newArr[i] = elements[i];
            }
            elements = newArr; // 把旧的那个柜子扔掉
        }
        elements[size++] = element;
    }

    /**
     * 删除相同元素
     * @param element
     */
    @Override
    public void delete(Object element) {
        int index = indexOf(element);
        if (index >= 0) {
            delete(index);
        }
    }

    /**
     * 根据索引删除元素
     * @param index
     */
    @Override
    public void delete(int index) {
        // 前移[紧缩]
        for (int i = index; i < size - 1; i++) {
            elements[i] = elements[i + 1];
        }
        elements[size - 1] = null;
        size -= 1;
    }

    /**
     * 将指定索引位置的元素替换成新元素
     * @param index
     * @param newElement
     */
    @Override
    public void update(int index, Object newElement) {
        elements[index] = newElement;
    }

    /**
     * 当前列表中是否含有target这个元素
     * @param target
     * @return
     */
    @Override
    public boolean contains(Object target) {

        return indexOf(target) >= 0;
    }

    /**
     * 返回指定索引处的元素
     * @param index
     * @return
     */
    @Override
    public Object at(int index) {

        return elements[index];
    }

    /**
     * 查找element的索引,如果没有返回-1 
     * @param element
     * @return
     */
    @Override
    public int indexOf(Object element) {
        for (int i = 0; i < size; i++) {
            if (elements[i].equals(element)) {
                return i;
            }
        }
        return -1;
    }

}
复制代码

 

posted @   瓶子coder  阅读(462)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示