java实现的顺序表

java实现的顺序表

(1)List接口

public interface List<E> {
  public int getSize();
  public boolean isEmpty();
  public void add(int index,E e);
  public void addFirst(E e);
  public void addLast(E e);
  public E get(int index);
  public E getFirst();
  public E getLast();
  public void set(int index,E e);
  public boolean contains(E e);
  public int find(E e);
  public E remove(int index);
  public E removeFirst();
  public E removeLast();
  public void removeElement(E e);
  public void clear();
}

(2)ArrsyList类实现list接口

package 顺序表;

import java.util.Arrays;
/*
 * 简易的顺序表
 * 线性表定义:零个或多个数据的有限序列。
 * 切记:顺序表就是又叫动态数组
 * 而满足数组的前提就是地址大小相等并且相等的同一组数据。
 * 查改时间复杂度为o(1)
 * 增删时间复杂度为o(n)
 * 元素允许重复
 * 排序随机
 * 先进先出
 * 允许空值
 */
public class ArrayList<E> implements List<E> {
	private E[] data;
	private int size;
	private static final int DEFAULT_CAPACITY = 10;

	public ArrayList(int capacity) {
		if (capacity < 0) {
			capacity = DEFAULT_CAPACITY;
		}
		data = (E[]) new Object[DEFAULT_CAPACITY];
		this.size = 0;
	}

	public ArrayList() {
		this(DEFAULT_CAPACITY);
	}

	@Override
	public String toString() {
		StringBuilder str = new StringBuilder();
		if (isEmpty()) {
			str.append(String.format("顺序表[]:当前容量为%d/%d\n", this.size, data.length));
		} else {
			str.append("顺序表[");
			for (int i = 0; i < size; i++) {	
				if (i != size - 1) {
					str.append(data[i] + ",");
				} else {
					str.append(data[i] + "]:");
				}
			}
			str.append(String.format("当前容量为%d/%d", this.size, data.length));
		}
		return str.toString();
	}

	@Override
	public int getSize() {
		// TODO Auto-generated method stub
		return this.size;
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return this.size == 0;
	}

	@Override
	public void add(int index, E e) {
		// TODO Auto-generated method stub
		if (index < 0 || index > size) {
			throw new IllegalArgumentException("下标有误!!!");
		}
		if (size == data.length) {
			resize(data.length * 2);
		}
		for (int i = size; i > index; i--) {
			data[i] = data[i - 1];
		}
		data[index] = e;
		size++;
	}

	private void resize(int newlength) {
		// TODO Auto-generated method stub
		E[] newData = (E[]) new Object[newlength];
		for (int i = 0; i < Math.min(newData.length, data.length); i++) {
			newData[i] = data[i];
		}
		data = newData;
	}

	@Override
	public void addFirst(E e) {
		// TODO Auto-generated method stub
		add(0, e);
	}

	@Override
	public void addLast(E e) {
		// TODO Auto-generated method stub
		add(size, e);
	}

	@Override
	public E get(int index) {
		// TODO Auto-generated method stub
		if (index < 0 || index >= data.length) {
			throw new IllegalArgumentException("下标有误!");
		}
		return data[index];
	}

	@Override
	public E getFirst() {
		// TODO Auto-generated method stub
		return get(0);
	}

	@Override
	public E getLast() {
		// TODO Auto-generated method stub
		return get(size - 1);
	}

	@Override
	public void set(int index, E e) {
		// TODO Auto-generated method stub
		if (index < 0 || index >= size) {
			throw new IllegalArgumentException("下标有误!!");
		}
		data[index] = e;
	}

	@Override
	public boolean contains(E e) {
		// TODO Auto-generated method stub
		return find(e) != -1;
	}

	@Override
	public int find(E e) {
		// TODO Auto-generated method stub
		for (int i = 0; i < size; i++) {
			if (data[i] == e) {
				return i;
			}
		}
		return -1;
	}

	@Override
	public E remove(int index) {
		// TODO Auto-generated method stub
		if (index < 0 || index >= size) {
			throw new IllegalArgumentException("下标有误!!!!!");
		}
		E datas = data[index];
		for (int i = index; i < size - 1; i++) {
			data[i] = data[i + 1];
		}
		size--;
		if (size == data.length / 4 && size > 10) {
			resize(data.length / 2);
		}
		return datas;
	}

	@Override
	public E removeFirst() {
		// TODO Auto-generated method stub
		return remove(0);
	}

	@Override
	public E removeLast() {
		// TODO Auto-generated method stub
		return remove(size - 1);
	}

	@Override
	public void removeElement(E e) {
		// TODO Auto-generated method stub
		if (find(e) != -1) {
			remove(find(e));
		}
	}

	@Override
	public void clear() {
		// TODO Auto-generated method stub
		data = (E[]) new Object[DEFAULT_CAPACITY];
		this.size = 0;
	}

	public int getCapacity() {
		return data.length;
	}

	public void swap(int i, int j) {
		if (i < 0 || i >= size || j < 0 || j >= size) {
			throw new IllegalArgumentException("交换角标非法");
		}
		E temp = data[i];
		data[i] = data[j];
		data[j] = temp;
	}
}

(3)ArrayList测试

package 顺序表;

public class TestArrayList {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<Integer> arr=new ArrayList<Integer>();
		System.out.println(arr);
		arr.addFirst(2);
		System.out.println(arr);
		arr.addFirst(2);
		arr.addFirst(4);
		arr.addFirst(6);
		arr.addFirst(8);
		arr.addFirst(2);
		arr.addFirst(4);
		arr.addFirst(6);
		arr.addFirst(8);
		arr.addFirst(9);
		arr.addFirst(88);
		System.out.println(arr);
		System.out.println(arr.getCapacity());
		System.out.println(arr.find(88));
		arr.swap(2, 3);
		System.out.println(arr);
		arr.remove(5);
		System.out.println(arr);
		arr.removeElement(4);//
		System.out.println(arr);
		System.out.println(arr.find(88));
	}

}

(4)测试结果

顺序表[]:当前容量为0/10

顺序表[2]:当前容量为1/10
顺序表[88,9,8,6,4,2,8,6,4,2,2]:当前容量为11/20
20
0
顺序表[88,9,6,8,4,2,8,6,4,2,2]:当前容量为11/20
顺序表[88,9,6,8,4,8,6,4,2,2]:当前容量为10/20
顺序表[88,9,6,8,8,6,4,2,2]:当前容量为9/20
0
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值