前言
今天有点无聊,写了一个自定义数组,里边主要实现很多js中数组的方法,例如:排序、数组连接、删除、剪切。算是加深对java的一些基础操作的印象。
代码
/**
* @Auther dbc
* @Date 2020/9/5 22:03
* 自定义数组,数组元素为Object类
* 构造方法:
* MyArrayList() 初始化数组,长度为0
* MyArrayList(int size) 创建长度为size的数组
* MyArrayList(Object... objects) 初始化即加入一些元素
* 主要方法:
* String join() 方法用于根据分隔符把数组中的所有元素放入一个字符串,默认分隔符为","逗号.
* String join(String separator) example: 元素为0,1,2,3的数组 使用join("-")得到:0-1-2-3
* String toString() 得到数组字符串形式
* boolean add(int index,Object o) 在指定索引后增加元素
* void add(Object... objects) 在数组末尾添加元素
* Object pop() 删除并返回数组最后一个元素
* MyArrayList splice(int index,int length) 在原数组从索引index开始剪切length长度个元素,返回剪切后的新的数组
* MyArrayList update(int index,Object o) 修改指定索引的元素
* Object shift() 删除并返回数组的第一个元素
* void unShift(Object... objects) 在数组开头添加元素
* MyArrayList slice(int start,int end) 方法可从已有的数组中返回选定的元素
* void sortAsc() 对数组进行升序排序(选择排序) 前提:数组元素均为Integer、Double、Float中的一种
* void sortDesc() 对数组进行降序排序(冒泡排序) 前提:数组元素均为Integer、Double、Float中的一种
* MyArrayList concat(MyArrayList... allList) 方法用于连接两个或多个数组(该方法不会改变现有的数组)
* void reverse() 颠倒数组中的元素
* Object charAt(int index) 获取索引index处的元素
* int indexOf(Object o,int startIndex) 从startIndex开始向后获取某个元素在数组的索引,没有则返回-1
* int lastIndexOf(Object o,int startIndex) 从startIndex开始向前获取某个元素在数组的索引,没有则返回-1
*
*/
public class MyArrayList {
private Object[] elementData;//元素
private int size;//数组长度
private static final float DEFAULT_EXPAND_FACTOR = 0.75f;//扩容因子
private static final float DEFAULT_NARROW_FACTOR = 0.5f;//缩小容量的因子
private static final int MAXIMUM_CAPACITY = 1 << 30;//最大容量
private static String joinSeparator =","; //join方法默认的分隔符
/**
* 从startIndex开始向前获取某个元素在数组的索引,没有则返回-1
* @param o
* @param startIndex
* @return
*/
public int lastIndexOf(Object o,int startIndex){
if(startIndex<0) startIndex=0;
if(startIndex>=size) startIndex=size-1;
for(int i=startIndex;i>=0;i--){
if(elementData[i].equals(o)) return i;
}
return -1;
}
/**
* 从startIndex开始向后获取某个元素在数组的索引,没有则返回-1
* @param o
* @param startIndex
* @return
*/
public int indexOf(Object o,int startIndex){
if(startIndex<0) startIndex=0;
if(startIndex>=size) startIndex=size-1;
for(int i=startIndex;i<size;i++){
if(elementData[i].equals(o)) return i;
}
return -1;
}
/**
* 颠倒数组中的元素
*/
public void reverse(){
Object o;
for(int i=0;i<size/2;i++){
o=elementData[i];
elementData[i] = elementData[size-i-1];
elementData[size-i-1] =o;
}
}
/**
* 连接多个数组
* @param allList
* @return
*/
public MyArrayList concat(MyArrayList... allList){
MyArrayList concatData =new MyArrayList(this.getElementData());
for (MyArrayList myArrayList:allList) {
concatData.add(myArrayList.getElementData());
}
return concatData;
}
/**
* 对数组进行升序排序
*/
public void sortAsc(){
if(!isAllNumArray()) return;
Object o;
//选择排序
for(int i=0;i<size-1;i++){
int min = i;//最小数的索引
for(int j=i+1;j<size;j++){
if(Double.parseDouble(elementData[i].toString())>Double.parseDouble(elementData[j].toString())){
min = j;
}
}
if(min ==i) continue;
o = elementData[i];
elementData[i]=elementData[min];
elementData[min] = o;
}
}
/**
* 对数组进行降序排序
*/
public void sortDesc(){
if(!isAllNumArray()) return;
Object o;
//冒泡排序
for(int i=0;i<size-1;i++){
for(int j=i+1;j<size;j++){
if(Double.parseDouble(elementData[i].toString())<Double.parseDouble(elementData[j].toString())){
o=elementData[i];
elementData[i]=elementData[j];
elementData[j]=o;
}
}
}
}
/**
* 方法可从已有的数组中返回选定的元素
* @param start
* @param end
* @return
*/
public MyArrayList slice(int start,int end){
if(start<0) return new MyArrayList();
if(end>=size) end=size-1;
Object[] sliceData =new Object[end-start+1];
for(int i=start;i<=end;i++){
sliceData[i-start]=elementData[i];
}
return new MyArrayList(sliceData);
}
/**
* 在数组开头添加元素
* @param objects
*/
public void unShift(Object... objects){
int len =objects.length;
ensureCapacity(len);
for(int i=size+len-1;i>=len;i--){
elementData[i]=elementData[i-len];
}
for (int i=0;i<len;i++){
elementData[i]=objects[i];
}
size+=len;
}
/**
* 删除并返回数组的第一个元素
* @return
*/
public Object shift(){
if(size<=0) return null;
Object o = elementData[0];
for(int i=0;i<size-1;i++){
elementData[i]=elementData[i+1];
}
size--;
return o;
}
/**
* 修改指定位置的元素
* @param index
* @param o
* @return
*/
public MyArrayList update(int index,Object o){
if(index<0 || index>=size) return this;
this.elementData[index]=o;
return this;
}
/**
* 删除元素,并返回被删除的元素数组
* @param index 从index索引开始删除
* @param length 删除的长度。若删除超过数组下标,默认从索引index一直删除到数组的最后一个元素。
* @return
*/
public MyArrayList splice(int index,int length){
if(index<0 || index>size-1) return new MyArrayList();
if(length<=0) return new MyArrayList();
if(index+length>size) length =size-index;
Object[] removeList =new Object[length];
//开始删除
for(int i=0;i<length;i++){
removeList[i] =elementData[index+i];
if(i+length<elementData.length){
elementData[index+i] =elementData[index+length+i];
}else {
elementData[index+i]=null;
}
}
for(int i=index+length;i<size;i++){
if(i+length>=elementData.length) break;
elementData[i] = elementData[i+length];
}
size-=length;
return new MyArrayList(removeList);
}
/**
* 删除并返回数组的最后一个元素
*/
public Object pop(){
if(size<=0) return null;
Object removeEle=elementData[size-1];
elementData[--size]=null;
return removeEle;
}
/**
* 增加元素 方式二:指定下标的后面添加
* @param o 新元素
* @param index 索引
*/
public boolean add(int index,Object o){
if(index<0 || index>=size) return false;
ensureCapacity(1);//检测容量
for(int i=size;i>index+1;i--){
elementData[i] =elementData[i-1];
}
elementData[index+1]=o;
size++;
return true;
}
/**
* 增加元素 方式一:末尾添加
* js中的push()方法
*/
public void add(Object... objects){
//检测容量
ensureCapacity(objects.length);
//末尾增加
for(int i=0;i<objects.length;i++){
elementData[size++] =objects[i];
}
}
/**
* 获取数组长度
*
*/
public int getSize(){
return this.size;
}
/**
* toString
*/
public String toString(){
StringBuffer sb =new StringBuffer("[");
for(int i=0;i<size;i++){
sb.append(elementData[i]);
sb.append(",");
}
String str;
if(size>0){
str = sb.substring(0, sb.length() - 1);
str+="]";
}else{
sb.append("]");
str =sb.toString();
}
return str;
}
/**
* join() 方法用于把数组中的所有元素放入一个字符串
* 元素是通过指定的分隔符进行分隔的
* 使用默认的方法
*/
public String join(){
StringBuffer sb =new StringBuffer();
for(int i=0;i<size;i++){
sb.append(elementData[i]);
sb.append(joinSeparator);
}
if(size==0) return "";
return sb.substring(0, sb.length() - 1);
}
/**
* join() 方法用于把数组中的所有元素放入一个字符串
* 元素是通过指定的分隔符进行分隔的
* 使用默认的方法
*/
public String join(String separator){
StringBuffer sb =new StringBuffer();
for(int i=0;i<size;i++){
sb.append(elementData[i]);
sb.append(separator);
}
if(size==0) return "";
return sb.substring(0, sb.length() - 1);
}
/**
* @param addNum 此次添加的数目
* 检测数组容量与实际元素个数是否达到扩容标准,若达到则扩容,否则不管
*/
private void ensureCapacity(int addNum){
//容量*扩容因子>size && 容量*缩容因子<size
if(size+addNum<elementData.length*DEFAULT_EXPAND_FACTOR
&& size+addNum<elementData.length*DEFAULT_NARROW_FACTOR) return;
//达到扩容要求,计算新的容量
int capacity = (int)((size+addNum)/DEFAULT_EXPAND_FACTOR);
//大于最大容量,不管了只有
if(capacity>MAXIMUM_CAPACITY) capacity =MAXIMUM_CAPACITY;
elementData= Arrays.copyOf(elementData,capacity);
}
/**
* 获取所有数组元素
* @return
*/
public Object[] getElementData(){
return Arrays.copyOf(this.elementData,size);
}
/**
* 获取数组某个元素
* @return
*/
public Object charAt(int index){
if(index<0 || index>=size) return null;
return this.elementData[index];
}
/**
* 判断数组元素是否都是数字
* @return
*/
private boolean isAllNumArray(){
for(int i=0;i<size;i++){
if(elementData[i] instanceof Integer || elementData[i] instanceof Float
|| elementData[i] instanceof Double) {
}
else return false;
}
return true;
}
public MyArrayList(){
this.size =0;
this.elementData =new Object[0];
}
/**
* 定义长度为size的空数组
* @param size
*/
public MyArrayList(int size){
if(size<0) size=0;//确保不为负数
this.elementData =new Object[size];
this.size=0;
}
/**
* 初始化数组,并初始化数组内容
* @param objects
*/
public MyArrayList(Object... objects){
this.size=objects.length;
elementData=Arrays.copyOf(objects,size);
ensureCapacity(1);//扩容
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。