public class MyArrayList {
public long[] array; //存放数据
private int size; //元素个数
public MyArrayList(){
array=new long[20];//ArrayList初始化时的长度
size=0;//初始化时的size
Arrays.fill(array,size,array.length,Long.MIN_VALUE);//初始化时数组里的值都应该是默认值
}
public int size(){
return size;//返回size即可,不存在同名形参,可以不使用this
}
public void add(long val){
ensureCapacity();//确保数组长度足够
array[size]=val;
size++;
}
private void ensureCapacity() { //因为只会在当前类是使用,因此对方法进行封装
if (size<array.length){ //数组够用不用扩充
return;
}
array=Arrays.copyOf(array,array.length*2);// 数组不够用时进行扩充,对原来的数组进行复制
Arrays.fill(array,size,array.length,Long.MIN_VALUE);// 并对新的数组填充默认值
}
public long get(int index){
if (index<0||index>size){ //首先对传进来的下标判断是否合法
throw new RuntimeException("请输入正确的下标!");
}
return array[index];
}
public void add(int index,long val){
if (index<0||index>size){ //首先对传进来的下标判断是否合法
throw new RuntimeException("请输入正确的下标!");
}
ensureCapacity(); //添加元素时都需要判断数组长度是否足够
for (int i=size;i>index;i--){
array[i]=array[i-1]; //将原来的array[index]及以后的元素整体向后平移
}
array[index]=val; //在index插入元素
size++; //加入了一个新元素后千万要记得size++
}
public long delete(int index){ //按下标删除
if (index<0||index>size){ //首先对传进来的下标判断是否合法
throw new RuntimeException("请输入正确的下标!");
}
long val=array[index];
for (int i=index;i<size-1;i++){
array[i]=array[i+1]; //将array[index]后的元素往前平移。并且覆盖掉原有的array[index]
}
size--; //删除了一个新元素后千万要记得size--
Arrays.fill(array,size,array.length,Long.MIN_VALUE);//删除了一个元素后size也改变了,记得初始化size~arr.length之间的值
return val; //返回删除的值
}
public void removeFromHead(long val){
int index=0; //不建议使用for循环遍历查找删除的方式,因为时间复杂度是O(n*n)
while (index!=size){ //查找想删除的元素是否存在
if (array[index]==val){
break; //如果存在跳出循环,array[index]后的元素向前平移
}
index++;
}
if (index==size){ //没找到待删除的元素,直接返回
return;
}
for (int i=index;i<size-1;i++){ //array[index]后的元素向前平移,覆盖掉了原来的array[index]
array[i]=array[i+1];
}
size--; //删除了一个新元素后千万要记得size--
Arrays.fill(array,size,array.length,Long.MIN_VALUE);//删除了一个元素后size也改变了,记得初始化size~arr.length之间的值
}
public void removeFromLast(long val){
int index=size; //从后向前查找
while (index<0){
if (array[index]==val){ //查找想删除的元素是否存在
break;
}
index--;
}
if (index==-1){ //没找到待删除的元素,直接返回
return;
}
for (int i=index;i<size-1;i++){ //array[index]后的元素向前平移,覆盖掉了原来的array[index]
array[i]=array[i+1];
}
size--; //删除了一个新元素后千万要记得size--
Arrays.fill(array,size,array.length,Long.MIN_VALUE);//删除了一个元素后size也改变了,记得初始化size~arr.length之间的值
}
public void removeAll(long val){
int slow=0; //新数组下标
int quick;
for (quick=0;quick<size;quick++){ //对原来的数组进行遍历查找val
if (array[quick]!=val){ //如果不等就进行复制,slow为新数组长度
array[slow]=array[quick];
slow++;
}
}
size=slow;
Arrays.fill(array,slow,array.length,Long.MIN_VALUE);//size变为slow,对数组填充默认值
}
public void check(){ //检查方法
if (array==null){
throw new RuntimeException();
}
if (array.length==0){
throw new RuntimeException();
}
if (size<0){
throw new RuntimeException();
}
if (size>array.length){
throw new RuntimeException();
}
for (int i=0;i<size;i++){
if (array[i]==Long.MIN_VALUE){
throw new RuntimeException();
}
}
for (int i=size;i<array.length;i++){
if (array[i]!=Long.MIN_VALUE){
throw new RuntimeException();
}
}
}
}