动态数组(只存int类型)实现增删改查等基本操作(有错误提出来大家一起学习)

/**
 * 基于数组编写动态数组的类
 * @author  hcc
 */
public class HArrayList {
	
	//默认数组的容量
	private static final int DEFAULT_CAPACITY = 10;
	//用来存储数据的数组
	private int[] data;
	//数据的个数(大小)
	private int size;
	
	/**
	 * 有参构造函数
	 * @param capacity 数组的容量
	 */
	public HArrayList(int capacity) {
		if(capacity > 0) {
			this.data = new int[capacity];			
			size = 0;
		}
		else {
			throw new  IllegalArgumentException("初始容量:"+capacity);
		}
	}
	/**
	 * 这个先不用
	 * @param data 传入的数组
	 */
	public HArrayList(int[] data) {
		this.data = data;
	}
	
	/**
	 * 无参构造函数 默认容量为10
	 */
	public HArrayList() {
		this(DEFAULT_CAPACITY);
	}
	/**
	 * 判断是否为空
	 * @return true表示为空 false表示不为空
	 */
	public boolean isEmpty() {
//		if(size==0) {
//			return true;
//		}
//		return false;
		//简写方式
		return size == 0;
	}
	
	/**
	 * 获取数组中数据的个数
	 * @return 数据的数量
	 */
	public int getSize() {
		return this.size;
	}
	/**
	 * 获取数组的容量
	 * @return 输入容量
	 */
	public int getCapacity() {
		return this.data.length;
	}
	
	/**
	 * 将数据转化为字符串并返回
	 */
	public String toString() {
		StringBuilder str  = new StringBuilder();
		str.append(String.format("HArray: size = %d, capacity = %d\n", this.size,data.length));
		if(this.size != 0) {
			str.append("[");
			for(int i = 0;i<this.size;i++) {
				if(i == (size-1)) {
					str.append(this.data[i]);
					str.append("]");
					break;
				}
				str.append(this.data[i]+",");
			}
		}
		return str.toString();
	}
	
	/**
	 * @param num 要判断的数据
	 * @return true表示存在 false表示不存在
	 */
	public boolean contains(int num) {
		for(int i = 0; i < this.size;i++) {
			if(num == data[i]) {
					return true;
			}
		}
		return false;
	}
	/**
	 * 添加数据 差一点的就是没有实现动态扩容
	 * @param index 数据添加的位置
	 * @param num 将要添加的数据
	 */
	public void add(int index,int num) {
		//如果“位置“的值小于0 或者大于最大的容量 报错 
		//熟知:size的大小应该是小于等于data.length 大于等于0的
		if(index < 0 || index > this.data.length) {
			throw new IllegalArgumentException("索引错误信息: index>capacity 或者 index<0");
		}else if(index > this.size) {
			//该条件判断的是:不能在任意位置添加数据,必须满足在插入的位置之前有数据
			throw new IllegalArgumentException("索引错误信息: index>size");
		}else {
			//判断是否需要扩容 当数据的个数和容量相等时需要扩容
			if(this.size == this.data.length) {
				throw new IllegalArgumentException("数组容量已满!");
			}
			//将index(包括)之后的数据向后挪动
			for(int i = size-1;i>index-1;i--) {
				this.data[i+1] = this.data[i];
			}
			this.data[index] = num;
			this.size++;
		}
	}
	/**
	 * 在末尾插入数据
	 * @param num
	 */
	public void add(int num) {
		add(this.size,num);
	}
	
	/**
	 * 删除指定位置的数据
	 * @param index 索引
	 * @return true表示删除成功 false表示删除失败
	 */
	public int remove(int index) {	
		if(index < 0 || index >= this.size) {
			throw new IllegalArgumentException("索引错误信息: index>size 或者 index<0");
		}
		int num = this.data[index];
		for (int i = index; i < (size - 1); i++) {
			this.data[i] = this.data[i + 1];
		}
		size--;	
		return num;
	}
	/**
	 * 删除数组中值为num的第一个位置上的数据
	 * @param num 要删除的数据
	 * @return true表示删除成功 false表示删除失败
	 */
	public boolean removeElement(int num) {
		int index = find(num);
		if(index == -1) {
			throw new IllegalArgumentException("数组中没有"+ num +"这个值!");
		}
		return remove(index) == num;
	}
	/**
	 * 删除数组中值为num的所有数据
	 * @param num 要删除的数据
	 * @return true表示删除成功 false表示删除失败
	 */
	public boolean removeAllElement(int num) {
		int[] indexs = findAll(num);
		boolean tf = false;
		for (int i = 0; i < indexs.length; i++) {
			tf = (remove(indexs[i]) == num);
		}
		return tf;
	}
	/**
	 * 修改指定位置的值
	 * @param index 索引
	 * @param num 值
	 */
	public void set(int index,int num) {
		if(index < 0 || index >= this.size) {
			throw new IllegalArgumentException("索引错误信息: index>size 或者 index<0");
		}
		this.data[index] = num;
	}
	/**
	 * 得到某个元素在数组中的第一个位置
	 * @param num 索引
	 * @return -1表示该数据不存在 其他大于等于0小于等于size的表示位置
	 */
	public int find(int num) {
		for(int i = 0;i < this.size; i++) {
			if(this.data[i] == num) {
				return i;
			}
		}
		return -1;
	}
	/**
	 *得到某个元素在数组中的所有位置(索引)
	 * @param num 数据
	 * @return 索引
	 */
	public int[] findAll(int num) {
		int[] arr = new int[size];
		int position = 0;
		for(int i = 0;i<this.size;i++) {
			if(num == this.data[i]) {
				arr[position] = i;
				position++;
			}
		}
		//以下操作是把数据从长度为size的数据转移到了长度为"num在数组中的个数"中去
		int[] arr1 = new int[position];
		for(int i = 0;i < position;i++) {
			arr1[i] = arr[i];
		}
		return arr1;
	}

	/**
	 * 通过索引获取数组中的值
	 * @param index 索引
	 * @return 返回数据
	 */
	public int get(int index) {
		if(index < 0 || index >= this.size) {
			throw new IllegalArgumentException("索引错误信息: index>size 或者 index<0");
		}
		return this.data[index];
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值