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

一、数据结构基本概念

-数据:一切可以输入计算机并能被处理的都是数据;

-数据元素

-数据对象

学生-数据对象,姓名,性别,身高,课程代号是数据元素,身高是数据项。

二、数据结构(data structure)

》逻辑结构

-集合:元素罗列在一起

-线性结构:元素前后相继(一一对应)

-树形结构:元素存在一对多的关系

-图结构或网状结构:元素之间存在多对多的关系。

》存储结构

-顺序存储:地址连续,用数组。

-链式存储:地址不连续,用指针(引用,面向对象)。

树和图基本都是链式存储,其他存储结构基本都是顺序存储和链式存储。

三、数据结构就是用一种特别的方式存起来,便于方便的取出来。

数据结构的主要运算(操作)

为了某种特殊需求(取数据),而专门设计的数据存储方式。

①建立一个数据结构;②消除一个数据结构;③删除;④插入;⑤访问;⑥修改;⑦排序;⑧查找;

四、列表:顺序表和链表

>定义列表接口

>用数组实现-MyArrayList

>实现链表

>java List API

>相关技巧

五、用顺序存储(数组)来实现列表

5.1建一个接口

public interface MyList {
	void add(Object element);//新增一个元素
	void delete(Object element);//删除相同元素
	void deleteByIndex(int index);//根据索引删除元素
	void update(int index,Object newElement);//将指定索引位置的元素替换成新元素
	boolean contains(Object target);//当前列表中是否含有target元素
	Object at(int index);//根据指定索引返回元素
	int indexOf(Object element);//查找element所在的索引,如果没有返回-1
}

5.2写实现类

public class MyArrayList implements MyList{
	private Object[] elements;//真正存储元素的底层结构
	private int size;//元素个数
	private int capacity=10;//容量
	
	public MyArrayList(int capacity) {//指定数组容量
		this.capacity = capacity;
		elements=new Object[capacity];
	}
	public MyArrayList() {//默认数组容量
		elements=new Object[capacity];
	}
	@Override
	public void add(Object element) {
		if(size==capacity) {//扩容
			capacity*=2;
			Object[] newArr=new Object[capacity];//因为数组长度不可变,所以要新建一个新的数组,把旧的数组元素拷过来
			for(int i=0;i<size;i++) {//O(n),耗费时间,耗费内存
				newArr[i]=elements[i];
			}
			elements=newArr;//把旧的那个数组丢掉
		}else {
		elements[size++]=element;
		}
	}

	@Override
	public void delete(Object element) {
		int index=indexOf(element);
		if(index>=0) {
			deleteByIndex(index);
		}
	}

	@Override
	public void deleteByIndex(int index) {//紧密
			Object[] newArr=new Object[capacity-1];//因为数组长度不可变,所以要新建一个新的数组,把旧的数组元素拷过来
			for(int i=0;i<size;i++) {//O(n),耗费时间,耗费内存
				if(i==index) continue;
				newArr[i]=elements[i];
			}
			elements=newArr;//把旧的那个数组丢掉	
	}

	@Override
	public void update(int index, Object newElement) {
		elements[index]=newElement;
	}

	@Override
	public boolean contains(Object target) {
		return indexOf(target)>0;
	}

	@Override
	public Object at(int index) {
		return elements[index];
	}
	@Override
	public int indexOf(Object element) {
		for(int i=0;i<size;i++) {
			if(elements[i].equals(element)) {
				return i;
			}
		}
		return -1;
		
	}
	//重写toString
	@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();
		//return "MyArrayList [elements=" + Arrays.toString(elements) + "]";//输出结果为:MyArrayList [elements=[周婷婷, 乐观, 勤奋, null, null, null, null, null, null, null]]
	}

	
}

5.3测试类

public class MyArrayListTest{
	public static void main(String[] args) {
		MyArrayList list=new MyArrayList();
		list.add("周婷婷");
		list.add("勤奋");
		list.add("乐观");
		list.add("修改内容");
		list.add("删除内容");
		list.add("删除下标");
		list.delete("删除内容");
		list.deleteByIndex(5);	
		list.update(3, "内容被修改了");
		boolean contain= list.contains("乐观");
		int indexOf=list.indexOf("勤奋");
		System.out.println(list);
		System.out.println(contain);
		System.out.println(indexOf);
	}
}

5.4运行结果

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值