重复造轮子虽然不可取,但是温习一下数据结构,光看不做总是少了什么,所以也来实现一下List,希望多多包涵。
既然要实现一个List,先来简单说一下List的定义
线性表是最基本、最简单、也是最常用的一种数据结构。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的
(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),
但是把最后一个数据元素的尾指针指向了哨位结点)。
我们说“线性”和“非线性”,只在逻辑层次上讨论,而不考虑存储层次,
所以双向链表和循环链表依旧是线性表。
在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。
一般线性表也就是我们通常所说的“线性表”,可以自由的删除或添加结点。受限线性表主要包括栈和队列,受限表示对结点的操作受限制。
因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构
以上为百度百科的定义。我们这次实现的是顺序存储结构
的线性表。按照顺序读取和存储。
1.首先用接口把线性表需要实现的操作声明。为了图省事,其他的常用操作未进行定义,可以自己去实现。所有的add,remove等操作都没有进行boolean值的返还。
public interface CetrinwList<E> {
/**
* 取得数据
*/
E get(int index);
/**
* 新增数据
*/
void add(E e);
/**
* 移除数据
*/
void remove(int index);
/**
* 插入数据
*/
void insert(int index,E e);
/**
* 是否存在数据
* @return
*/
boolean contains(Object o);
/**
* 获得List长度
* @return
*/
int size();
/**
* 是否为空
* @return
*/
boolean isEmpty();
/**
* 清空
*/
void clearList();
}
2.实现定义好的接口。
public class CetrinwArrayList<E> implements CetrinwList<E>{
/**
* 数组默认长度
*/
private static final int DEFAULT_SIZE = 10;
/**
* 存储队列中的元素
*/
private Object[] elements = null;
/**
*数组大小指针
*/
private int capacity;
/**
* 当前游标
*/
private int current;
public CetrinwArrayList(){
this(DEFAULT_SIZE);
}
public CetrinwArrayList(int size){
if(size < 0){
throw new RuntimeException("数组大小不能小于0");
}else{
this.elements = new Object[size];
this.current = 0;
capacity = size;
}
}
public E get(int index) {
confirmIndex(index);
return (E) this.elements[index];
}
public void add(E e) {
confirmSize();
this.elements[current] = e;
this.current++;
}
public void remove(int index) {
confirmIndex(index);
for (int i = index; i < elements.length; i++) {
if(i + 1 < elements.length){
elements[i] = elements[i+1];
}
}
current--;
}
public void insert(int index,E e) {
confirmIndex(index);
for (int i = 0; i < elements.length; i++) {
if(i >= index && i+2 < elements.length){
elements[i] = e;
elements[i+1] = elements[i+2];
}
}
current++;
}
public boolean contains(Object o) {
for (Object element : this.elements) {
if(o.equals(element)){
return true;
}
}
return false;
}
public int size() {
return this.current;
}
public boolean isEmpty() {
if(this.current >0){
return true;
}
return false;
}
public void clearList() {
elements = new Object[DEFAULT_SIZE];
}
/**
* 确认当前数组的容量,如果满足,则不操作,如果不满足,则增加空间
*/
private void confirmSize(){
if(this.current == this.capacity){
this.capacity = this.capacity + this.DEFAULT_SIZE;
Object[] newElemets = new Object[this.capacity];
for (int i = 0; i < this.elements.length; i++) {
newElemets[i] = this.elements[i];
}
this.elements = newElemets;
}
}
/**
* 判断下标是否越界
*/
private void confirmIndex(int index){
if(index > capacity || index < 0){
throw new RuntimeException("下标越界");
}
}
}
3.Junit的测试类
@Test
public void cetrinWArrayListTest(){
CetrinwList<String> list = new CetrinwArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
System.out.println("下标为3的元素为"+list.get(3));
System.out.println("数组size:"+list.size());
list.remove(2);
System.out.print("remove后的数组size:"+list.size());
System.out.println("remove后的数组:");
for (int i = 0; i < list.size() ; i++) {
System.out.print(list.get(i)+",");
}
list.insert(3,"gg");
System.out.println("");
System.out.println("insert后的数组:");
for (int i = 0; i < list.size() ; i++) {
System.out.print(list.get(i)+",");
}
}
4.运行结果
下标为3的元素为d
数组size:4
remove后的数组size:3remove后的数组:
a,b,d,
insert后的数组:
a,b,d,gg,
以上就是java实现的一个简单的ArrayList。