Array 可变长一维数组

这是一个可变长数组,对外提供API主要有set,get,可以用它来替代原始数组,不用考虑空间的大小。

此数组是一维的,存放的内容是非负整数,可以考虑用Object,此处用int为的是看起来简单。

每次扩展的长度大体是原来数组长度的10%,也就是oldLenght + oldLength/10,truancate可以缩短数组长度,同时给客户一个减少数组实际占用空间的机会。

class Array {
	private int a[]  = new int[0];
	private int length = 0;
	private static final int WASTER_FACTOR = 10;

	void set(int num, int pos) {
		assert pos >= 0;
		if(pos >= a.length) changeCapacity(pos + getNewCount(a.length));
		if(pos >= length) length = pos + 1;
		a[pos] = num;
	}

	int get(int pos) {
		assert pos >= 0 && pos < length;
		return a[pos];
	}

	int getLength() {
		return length;
	}

	void truncate(int length) {
		assert length >= 0 && length < this.length;
		
		this.length = length;

		if(length > a.length - 2*getNewCount(a.length)) return;
		int[] temp = new int[a.length - getNewCount(a.length)];
		for(int i=0; i<temp.length; i++) {
			temp[i] = a[i];
		}
		a = temp;
	}

	private void changeCapacity(int length) {
		int[] temp = new int[length];
		for(int i=0; i<a.length; i++) {
			temp[i] = a[i];
		}
		a = temp;
	}

	private int getNewCount(int oldLength) {
		return oldLength < 100? WASTER_FACTOR : oldLength/WASTER_FACTOR;
		
	}
}
 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值