Java SE—顺序表的增(头/中/尾)/删/(头/中/尾)查/改/

// 顺序表的元素类型 int
public class MyArrayList1 {
	// 属性是什么
	private int[] array;		// 代表的是存在数据的数组
								// array.length 代表的是数组的容量
	private int size;			// 记录顺序表的已有数据个数
	
	// 构造方法
	public MyArrayList1() {
		// 1. 申请空间
		array = new int[2];
		// 2. 初始化数据个数
		size = 0;
	}

	//index  需要插入的数据的下标;element   需要插入的数据
	// 增(重点)
	// 平均 O(1)
	public void pushBack(int element) {     //增在最后
		ensureCapacity();                 //调用扩容函数,增容
		array[size++] = element;           //直接把数插到最后即可
	}
	
	public void pushFront(int element) {  //增在开头
		ensureCapacity();                    //调用扩容函数,增容
		for (int i = size; i >= 1; i--) {    
			array[i]  = array[i - 1];      //用循环把前一个数赋给后一个数
		}
		//此时下标为0的地方为空
		
		array[0] = element;      //把要插入的数赋给下标为0的地方   
		size++;               //让size自增一次
	}
	
	public void insert(int index, int element) {   //要考虑是否把数插在数组下标以外的地方
		if (index < 0 || index > size) {    //只要满足一个条件就输出“下标错误”
			System.err.println("下标错误");
			return;
		}
		
		ensureCapacity();
		
		for (int i = size - 1; i >= index; i--) {
			array[i + 1] = array[i];
		}
		//for(int i=size;i>=index;i--){array[i]=array[i-1];}size++;
		array[index] = element;
		size++;
	}
	
	// 删(重点)
	public void popBack() {                  //删最后
		if (size <= 0) {                //顺序表为空则输出“顺序表为空”
			System.err.println("顺序表为空");
			return;
		}
		array[--size] = 0; //在原数组中让size-1为0即可,即size先--再引用
	}
	
	public void popFront() {              //删最前
		if (size <= 0) {
			System.err.println("顺序表为空");
			return;
		}
		
		//删最前面的数时,将后一个数赋给前一个数即可
		//for后面一般是修改后的数组的范围
		for (int i = 0; i < size - 1; i++) {
			array[i] = array[i + 1];
		}
		
		array[--size] = 0;
	}
	
	public void earse(int index) {             //删中间
		if (size <= 0) {
			System.err.println("顺序表为空");
			return;
		}
		
		if (index < 0 || index >= size) {
			System.err.println("下标错误");
			return;
		}
		
		for (int i = index + 1; i < size; i++) {
			array[i - 1] = array[i];
		}
		//for(int i=index;i<size-1;i++){array[i]=array[i+1];}
		array[--size] = 0;
	}
	
	
	// 打印
	public void print() {
		System.out.println("打印顺序表: 当前容量: " + array.length);
		for (int i = 0; i < size; i++) {
			System.out.print(array[i] + " ");
		}
		System.out.println();
	}
	
	// 保证容量够用,否则进行扩容
	private void ensureCapacity() {
		if (size < array.length) {
			return;
		}
		
		int newCapacity = array.length * 2;
		int[] newArray = new int[newCapacity];
		for (int i = 0; i < size; i++) {
			newArray[i] = array[i];
		}
		this.array = newArray;   //访问属性
	}
	
	//查  返回 element 在顺序表中的下标,如果出现多次,返回第一次出现的下标
	public int indexOf(int element) {
		for (int i = 0; i < size; i++) {
			if (array[i] == element) {
				return i;
			}
		}
		 
		return -1;
	}
	//get是查的第二种方式,返回的是那个下标所在的值
	public int get(int index) {
		if (index < 0 || index >= size) {
			System.err.println("下标错误");
			return -1;
		}
		return array[index];
	}
	//set是改
	public void set(int index, int element) {
		if (index < 0 || index >= size) {
			System.err.println("下标错误");
			return;
		}
		array[index] = element;
	}
	
	// 删除掉某一个元素,如果出现多次,删除第一次出现的
	public void remove(int element) {
		int mindex = indexOf(element);  //调用indexOf函数找到那个数字的下标
		if (index != -1) {     //说明那个数在表内
			earse(index);        //调用earse函数进行删除下标为index的数
		}
	}
	
	public int size() {
		return size;
	}
	
	public boolean isEmpty() {
		return size == 0;
	}
	
	public void removeAll(int element) {   //删除表中所有出现的这个数据
		int j = 0;
		for (int i = 0; i < size; i++) {   //?
			if (array[i] != element) {     //?
				array[j++] = array[i];     //?
			}
		}
		size = j;
		
	}
	
	public static void main(String[] args) {
		MyArrayList1 list = new MyArrayList1();
		list.print();
		list.pushBack(1);
		list.pushBack(2);
		list.pushBack(3);
		// 1 2 3
		list.print();	
		list.pushFront(10);
		list.pushFront(20);
		list.pushFront(30);
		// 30 20 10 1 2 3
		list.print();	
		list.insert(3, 100);
		// 30 20 10 100 1 2 3
		list.print();	
		list.insert(20, 200);	
		// 报错
		
		list.earse(2);
		list.earse(2);
		list.print();	
		// 30 20 1 2 3
		list.popFront();
		list.popFront();
		list.popFront();
		list.print();	
		// 2 3
		list.popBack();
		list.popBack();
		list.print();	
		// 空的
		list.popBack();	
		// 报错
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值