Java手写动态数组

package com.ct.array;

/**
* @author MoonMonster
* @version 创建时间:2015年10月21日 下午10:15:05
*/
public class Array {

//数组中元素个数
private int count = 0;
//初始容量大小
private int capcity = 16;
//增量,每次增加的比例
private double increment = 1.2;
//初始化数组
private Object[] src = new Object[capcity];

public Array() {

}

//自定义原始数组大小
public Array(int capcity) {
this.capcity = capcity;
}

// 增加
public void add(Object obj) {
//判断是否越界,如是,则扩充数组
if (count >= src.length) {
src = extend();
}

//将新增加的数据放在count处
src[count] = obj;
count++;
}

// 对数组的扩充
private Object[] extend() {
//扩充后的数组容量是旧的数组的increment倍
Object[] dest = new Object[(int) (src.length * increment)];
for (int i = 0; i < src.length; i++) {
dest[i] = src[i];
}

//返回扩充后的数组
return dest;
}

// 输出
public void print() {
for (int i = 0; i < count; i++) {
System.out.print(src[i] + " ");
}
System.out.println();
}

// 获得数组大小
public int size() {

return count;
}

// 插入
public void insert(int index, Object obj) {
if(count + 1 >= src.length){
src = extend();
}

//从最后一个元素开始,把前一个元素放到后一个位置来
for(int i=count; i>index; i--){
src[i] = src[i-1];
}
//将要插入的元素放在index处
src[index] = obj;
//在插入一个元素后,长度+1
count ++;
}

//替换index处的数据
public void replace(int index, Object obj){
src[index] = obj;
}

//删除index处的数据元素
public void delete(int index){
for(int i=index; i<src.length-1; i++){
src[i] = src[i+1];
}

count --;
}

//返回index处的数据
public Object get(int index){

return src[index];
}
}


测试类
package com.ct.array;
/**
* @author MoonMonster
* @version 创建时间:2015年10月21日 下午10:20:50
*/
public class Demo {

public static void main(String[] args) {

Array arr = new Array();
long t1 = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
arr.add(new Integer(i));
}
long t2 = System.currentTimeMillis();

System.out.println("耗时: " + (t2 - t1));

arr.insert(2, new Integer(123));
//删除
arr.delete(0);
//输出
arr.print();
//数组长度
System.out.println("数组的长度为: "+arr.size());
}
}



1. a.在定义增量时,不要定义成一个固定的值,每次扩充一定比例。
b.比例不是越大越好,也要考虑到内存问题,所以取个合适的值就行。
c.本来要测试取什么增量值最好,但每次测的结果误差太大,又不知道如何改,便放弃 了。
2. 在Array类中的src数组,可以定义成Object类型,那么便可使用全类型的数据,而不是某个固定下来的了。
3. 在删除和增加等方法中,不要使用临时数组来保存数据,那样会耗时耗内存。
4. 尽量不要在方法中出现重复的代码,例如add()和insert()方法中,都需要用到extend()方法中的代码,便可以提取出来封装为方法,易于修改和阅读。
5.先暂时写这几个方法,其他的例如查找是否存在某个数据或者某个数据有多少个,日后再说。
### Java 数组去重的方法 在 Java 中可以通过多种方式来去除数组中的重复元素。以下是几种常见的方法: #### 方法一:使用 HashSet 去重 由于 `HashSet` 不允许存储重复元素,因此可以利用这一特性轻松完成数组去重。 ```java import java.util.Arrays; import java.util.HashSet; public class ArrayDeduplication { public static int[] deduplicateUsingSet(int[] array) { // 将数组转换成 Set 集合自动过滤掉重复项 HashSet<Integer> set = new HashSet<>(); for (int item : array) { set.add(item); } // 把集合再转回数组返回 return set.stream().mapToInt(Number::intValue).toArray(); } public static void main(String[] args) { int[] originalArray = {1, 2, 3, 4, 4, 5}; int[] resultArray = deduplicateUsingSet(originalArray); System.out.println(Arrays.toString(resultArray)); } } ``` 这种方法简单高效,适合大多数场景下的需求[^1]。 #### 方法二:双指针法手动遍历比较 如果不希望依赖额外的数据结构,则可以选择通过两个嵌套循环逐个对比相邻元素的方式来进行去重操作。 ```java public class ManualDeduplication { public static int removeDuplicates(int[] nums) { if (nums.length == 0) return 0; int slow = 0; for (int fast = 1; fast < nums.length; ++fast) { if (nums[slow] != nums[fast]) { nums[++slow] = nums[fast]; } } return slow + 1; } public static void main(String[] args) { int[] numbers = {0,0,1,1,1,2,2,3,3,4}; int length = removeDuplicates(numbers); for (int i=0;i<length;i++){ System.out.print(numbers[i]+" "); } } } ``` 此代码片段展示了如何不借助任何辅助数据结构仅依靠原生逻辑实现数组内部的就地删除冗余元素功能.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值