数组 常用工具类

  • Post author:
  • Post category:其他




commons-lang3的ArrayUtils



静态常量

各个基本类型、引用类型的空数组

public static final boolean[] EMPTY_BOOLEAN_ARRAY = new boolean[0];

public static final Boolean[] EMPTY_BOOLEAN_OBJECT_ARRAY = new Boolean[0];

public static final byte[] EMPTY_BYTE_ARRAY = new byte[0];

public static final Byte[] EMPTY_BYTE_OBJECT_ARRAY = new Byte[0];

public static final char[] EMPTY_CHAR_ARRAY = new char[0];

public static final Character[] EMPTY_CHARACTER_OBJECT_ARRAY = new Character[0];

public static final Class<?>[] EMPTY_CLASS_ARRAY = new Class[0];

public static final double[] EMPTY_DOUBLE_ARRAY = new double[0];

public static final Double[] EMPTY_DOUBLE_OBJECT_ARRAY = new Double[0];

public static final Field[] EMPTY_FIELD_ARRAY = new Field[0];

public static final float[] EMPTY_FLOAT_ARRAY = new float[0];

public static final Float[] EMPTY_FLOAT_OBJECT_ARRAY = new Float[0];

public static final int[] EMPTY_INT_ARRAY = new int[0];

public static final Integer[] EMPTY_INTEGER_OBJECT_ARRAY = new Integer[0];

public static final long[] EMPTY_LONG_ARRAY = new long[0];

public static final Long[] EMPTY_LONG_OBJECT_ARRAY = new Long[0];

public static final Method[] EMPTY_METHOD_ARRAY = new Method[0];

public static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];

public static final short[] EMPTY_SHORT_ARRAY = new short[0];

public static final Short[] EMPTY_SHORT_OBJECT_ARRAY = new Short[0];

public static final String[] EMPTY_STRING_ARRAY = new String[0];

public static final Throwable[] EMPTY_THROWABLE_ARRAY = new Throwable[0];

public static final Type[] EMPTY_TYPE_ARRAY = new Type[0];

/**
 * 未找到元素时返回的index
 */
public static final int INDEX_NOT_FOUND = -1;



判断、比较
//是否为空(自身为null或元素数量为0)
boolean isEmpty = ArrayUtils.isEmpty(arr);
boolean isNotEmpty = ArrayUtils.isNotEmpty(arr);

boolean sameLength = ArrayUtils.isSameLength(arr1, arr2);
boolean isSameType = ArrayUtils.isSameType(arr1, arr2);


//数组元素是否有序,数值基本类型比较数值大小,char比较ASCII码值
boolean isSorted = ArrayUtils.isSorted(arr);
//引用类型使用该类型实现的 Comparable::compareTo 方法比较
boolean isSorted = ArrayUtils.isSorted(T[] arr);
//引用类型也可以指定比较使用的 Comparator
boolean isSorted = ArrayUtils.isSorted(T[] arr, Comparator<T> comparator);


//索引范围是否合法
boolean arrayIndexValid = ArrayUtils.isArrayIndexValid(arr, index);

boolean contains = ArrayUtils.contains(arr, ele);



get
//获取指定位置上的元素,index越界时返回defaultValue,缺省defaultValue时默认为null
T t = ArrayUtils.get(arr, index);
T t = ArrayUtils.get(arr, index, defaultValue);

//arr为null时返回0,相当于兜住了arr为null时的NPE
int length = ArrayUtils.getLength(arr);

//数组是empty时返回空数组,否则返回原数组 (null => 空数组)
T[] arr = ArrayUtils.nullToEmpty(arr);



indexOf
//查找指定元素第一次出现的位置
int index = ArrayUtils.indexOf(arr, ele);
//最后一次出现的位置
int lastIndexOf = ArrayUtils.lastIndexOf(arr, ele);

//可以指定检索开始位置(含)
int index = ArrayUtils.indexOf(arr, ele, startIndex);
int lastIndexOf = ArrayUtils.lastIndexOf(arr, ele, startIndex);

//查找指定元素在数组中所有出现之处,返回index集合
BitSet bitSet = ArrayUtils.indexesOf(arr, ele);

数组创建后,index就确定了,从前往后index从0开始,indexOf、lastIndexOf只是检索方向不同,不影响数组自身的index。



增删元素

增删元素会引起数组元素数量改变,都是先创建容量正好的新数组,再拷贝、添加需要的元素,返回新数组

//在数组末尾添加元素
T[] newArr = ArrayUtils.add(arr, ele);
//在数组开头添加元素
T[] newArr = ArrayUtils.addFirst(arr, ele);
//在数组末尾添加多个元素
T[] newArr = ArrayUtils.addAll(arr, ele...);

//在指定位置插入0个或多个元素
T[] newArr = ArrayUtils.insert(index, arr, ele...);


//移除指定位置上的元素
T[] newArr = ArrayUtils.remove(arr, index);
T[] newArr = ArrayUtils.removeAll(arr, index...);

//移除指定元素。如果指定元素在数组中出现多次,则每次只移除第1次出现之处
T[] newArr = ArrayUtils.removeElement(arr, ele);
T[] newArr = ArrayUtils.removeElements(arr, ele...);

//移除指定元素所有出现之处
T[] newArr = ArrayUtils.removeAllOccurrences(arr, ele);



元素排列
  • 以下操作都是返回void,直接在原数组上进行修改
  • java中涉及到区间的都是左闭右开 [startIndex, endIndex)
//数组反序排列
ArrayUtils.reverse(arr);
//将指定范围上的元素反序排列
ArrayUtils.reverse(arr, startIndex, endIndex);


//将元素位置顺移offset。eg.顺移3:index=0 => 0+3=3,index=-1 => -1+3=2
ArrayUtils.shift(arr, offset);
//只对指定区域上的元素进行顺移
ArrayUtils.shift(arr, startIndex, endIndex, offset);
//如果offset大于要顺移的元素数量,offset会直接取:对要顺移的元素数量取模得到的值


//洗牌、打乱,使用Fisher-Yates算法将数组元素随机排列
ArrayUtils.shuffle(arr);


//交换指定位置上的元素
ArrayUtils.swap(arr, index1, index2);
//交换2段元素,index1、index2是起点index,length指定片段长度(元素个数)
ArrayUtils.swap(arr, index1, index2, length);



切割、复制、转换
//切割得到子数组
T[] subarray = ArrayUtils.subarray(arr, startIndex, endIndex);

//克隆数组
T[] arr2 = ArrayUtils.clone(arr1);


//将相同类型的多个元素转换为数组
T[] arr = ArrayUtils.toArray(ele...);

//将基本类型数组转换为对应的引用类型数组
T[] arr2 = ArrayUtils.toObject(arr1);
//将引用类型数组转换为对应的基本类型数组
t[] arr2 ArrayUtils.toPrimitive(arr1);



版权声明:本文为chy_18883701161原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。