package cn.itsource.arryslist;
import java.util.Arrays;
/**
* 基于数组,适用于查改。
* 增删插效率低下
* 1. 请设计一个类ArrayListDemo,可以装多个不同类型的数据,初始长度是10个
* 底层是基于数组,因为是可以装不同数据类型的数据,所以是Object数组
* int/byte/short /boolean....
* Object[] value = new Object[10];
* value[0] = 1;//int 的1装好为对应的包装类Integer
*
* 2. 可以记录当前数据的个数 int size()
*
* 3. 可以任意添加任意类型的数据 void add(Object obj)
* version2 自动扩容
*
* 4. 可以打印当前数据结构的对象,格式如下:[值1,值2.。。。。]
*
* 5. 查询指定下标的元素 Object searchByIndex(int index)
* 6. 查询指定的元素第一次出现的位置 int searchByElement(Object ele);
*
* 7. 修改指定下标处的元素 void updateByIndex(int index,Object obj)
* 8. 删除指定下标处的元素,返回删除的元素 Object deleteByIndex(int index)
* 9. 删除的首次出现的指定元素 void deleteByElement(Object ele)
* 10.插入指定下标处一个指定元素 void insertByIndex(int index,Object obj)
*
* 11.将对象中所有元素清空 void clear();
* 12.可以创建指定长度的ArrayList对象
* 13.创建一个默认长度是10的ArrayList对象
* 14.创建一个默认长度是10,且有指定元素的ArrayList对象
*/
public class ArraysList {
/**声明一个成员变量的数组,并给10的长度*/
private Object[] value=new Object[10];
/**声明一个成员变量size 用来存储元素*/
private int size;
//2. 可以记录当前数据的个数 int size()
public int size() {
return size;
}
/**
* 3. 可以任意添加任意类型的数据 void add(Object obj)version2 自动扩容
* @param obj
*/
public void add(Object obj) {
selaDilatation();
value[size]=obj;
size++;
}
/**
* 4. 可以打印当前数据结构的对象,格式如下:[值1,值2.。。。。]
*/
@Override
public String toString() {
Object[] copyOf = Arrays.copyOf(value, size);
return Arrays.toString(copyOf);
}
/**
* 5. 查询指定下标的元素 Object searchByIndex(int index)
* @param index
* @return
*/
public Object searchByIndex(int index){
seleIndex(index);
return value[index];
}
/**
* 6. 查询指定的元素第一次出现的位置 int searchByElement(Object ele);
* @param ele
* @return
*/
public int searchByElement(Object ele){
if (ele==null) {
for (int i = 0; i < value.length; i++) {
if (ele==value[i]) {
return i;
}
}
}else {
for (int i = 0; i < value.length; i++) {
if (ele.equals(value[i])) {
return i;
}
}
}
return -1;
}
/**
* 7. 修改指定下标处的元素 void updateByIndex(int index,Object obj)
* @param index
* @param obj
*/
public void updateByIndex(int index,Object obj){
seleIndex(index);
value[index]=obj;
}
/**
* 8. 删除指定下标处的元素,返回删除的元素 Object deleteByIndex(int index)
* @param index
* @return
*/
public Object deleteByIndex(int index){
seleIndex(index);
Object obj=value[index];
System.arraycopy(value, index+1, value, index, size-index-1);
size--;
return obj;
}
/**
* 9. 删除的首次出现的指定元素 void deleteByElement(Object ele)
* @param ele
*/
public void deleteByElement(Object ele){
int searchByElement = searchByElement(ele);
if (searchByElement==-1) {
System.out.println("数组中没有"+ele);
return;
}
deleteByIndex(searchByElement);
}
/**
* 10.插入指定下标处一个指定元素 void insertByIndex(int index,Object obj)
* @param index
* @param obj
*/
public void insertByIndex(int index,Object obj){
if (index<0||index>size) {
throw new ArrayIndexOutOfBoundsException("插入的下标不合法,可插入范围[0,"+size+"]");
}
if (index==size) {
add(obj);
return;
}else{
selaDilatation();
System.arraycopy(value, index, value, index+1, size-index);
value[index]=obj;
size++;
}
}
/**
* 11.将对象中所有元素清空 void clear();
*/
public void clear() {
Arrays.fill(value, "null");
}
/**
* 12.可以创建指定长度的ArrayList对象
* @param length
*/
public ArraysList(int length){
super();
value=new Object[length];
}
/**
* 13.创建一个默认长度是10的ArrayList对象
*/
public ArraysList(){
this(10);
}
/**
* 14.创建一个默认长度是10,且有指定元素的ArrayList对象
* @param obj
*/
public ArraysList(Object obj){
this(10);
add(obj);
}
/**
* 当数组长度不够装数据时自动扩容
*/
private void selaDilatation() {
if (size ==value.length) {
value = Arrays.copyOf(value, value.length*2);
}
}
/**
* 判断数组下标是否越界
* @param index
*/
private void seleIndex(int index) {
if (index <0||index >size-1) {
throw new ArrayIndexOutOfBoundsException("数组下标越界,下标范围[0,"+(size-1)+"]");
}
}
}
基于数组(对象):可以保存多个不同类型的数据
最新推荐文章于 2024-04-23 17:10:28 发布