All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.xiaoleilu.hutool.util.ArrayUtil Maven / Gradle / Ivy

package com.xiaoleilu.hutool.util;

import java.lang.reflect.Array;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;

import com.xiaoleilu.hutool.collection.CollectionUtil;
import com.xiaoleilu.hutool.exceptions.UtilException;
import com.xiaoleilu.hutool.lang.Editor;
import com.xiaoleilu.hutool.lang.Filter;

/**
 * 数组工具类
 * 
 * @author Looly
 *
 */
public class ArrayUtil {

	/** 数组中元素未找到的下标,值为-1 */
	public static final int INDEX_NOT_FOUND = -1;

	// ---------------------------------------------------------------------- isEmpty
	/**
	 * 数组是否为空
	 * 
	 * @param  数组元素类型
	 * @param array 数组
	 * @return 是否为空
	 */
	@SuppressWarnings("unchecked")
	public static  boolean isEmpty(final T... array) {
		return array == null || array.length == 0;
	}

	/**
	 * 数组是否为空
* 此方法会匹配单一对象,如果此对象为{@code null}则返回true
* 如果此对象为非数组,理解为此对象为数组的第一个元素,则返回false
* 如果此对象为数组对象,数组长度大于0情况下返回false,否则返回true * * @param array 数组 * @return 是否为空 */ public static boolean isEmpty(final Object array) { if(null == array) { return true; }else if(isArray(array)) { return 0 == Array.getLength(array); } throw new UtilException("Object to provide is not a Array !"); } /** * 数组是否为空 * * @param array 数组 * @return 是否为空 */ public static boolean isEmpty(final long... array) { return array == null || array.length == 0; } /** * 数组是否为空 * * @param array 数组 * @return 是否为空 */ public static boolean isEmpty(final int... array) { return array == null || array.length == 0; } /** * 数组是否为空 * * @param array 数组 * @return 是否为空 */ public static boolean isEmpty(final short... array) { return array == null || array.length == 0; } /** * 数组是否为空 * * @param array 数组 * @return 是否为空 */ public static boolean isEmpty(final char... array) { return array == null || array.length == 0; } /** * 数组是否为空 * * @param array 数组 * @return 是否为空 */ public static boolean isEmpty(final byte... array) { return array == null || array.length == 0; } /** * 数组是否为空 * * @param array 数组 * @return 是否为空 */ public static boolean isEmpty(final double... array) { return array == null || array.length == 0; } /** * 数组是否为空 * * @param array 数组 * @return 是否为空 */ public static boolean isEmpty(final float... array) { return array == null || array.length == 0; } /** * 数组是否为空 * * @param array 数组 * @return 是否为空 */ public static boolean isEmpty(final boolean... array) { return array == null || array.length == 0; } // ---------------------------------------------------------------------- isNotEmpty /** * 数组是否为非空 * * @param 数组元素类型 * @param array 数组 * @return 是否为非空 */ @SuppressWarnings("unchecked") public static boolean isNotEmpty(final T... array) { return (array != null && array.length != 0); } /** * 数组是否为非空
* 此方法会匹配单一对象,如果此对象为{@code null}则返回false
* 如果此对象为非数组,理解为此对象为数组的第一个元素,则返回true
* 如果此对象为数组对象,数组长度大于0情况下返回true,否则返回false * * @param array 数组 * @return 是否为非空 */ public static boolean isNotEmpty(final Object array) { return false == isEmpty((Object) array); } /** * 数组是否为非空 * * @param array 数组 * @return 是否为非空 */ public static boolean isNotEmpty(final long... array) { return (array != null && array.length != 0); } /** * 数组是否为非空 * * @param array 数组 * @return 是否为非空 */ public static boolean isNotEmpty(final int... array) { return (array != null && array.length != 0); } /** * 数组是否为非空 * * @param array 数组 * @return 是否为非空 */ public static boolean isNotEmpty(final short... array) { return (array != null && array.length != 0); } /** * 数组是否为非空 * * @param array 数组 * @return 是否为非空 */ public static boolean isNotEmpty(final char... array) { return (array != null && array.length != 0); } /** * 数组是否为非空 * * @param array 数组 * @return 是否为非空 */ public static boolean isNotEmpty(final byte... array) { return (array != null && array.length != 0); } /** * 数组是否为非空 * * @param array 数组 * @return 是否为非空 */ public static boolean isNotEmpty(final double... array) { return (array != null && array.length != 0); } /** * 数组是否为非空 * * @param array 数组 * @return 是否为非空 */ public static boolean isNotEmpty(final float... array) { return (array != null && array.length != 0); } /** * 数组是否为非空 * * @param array 数组 * @return 是否为非空 */ public static boolean isNotEmpty(final boolean... array) { return (array != null && array.length != 0); } /** * 是否包含{@code null}元素 * * @param 数组元素类型 * @param array 被检查的数组 * @return 是否包含{@code null}元素 * @since 3.0.7 */ @SuppressWarnings("unchecked") public static boolean hasNull(T... array) { if (isNotEmpty(array)) { for (T element : array) { if (null == element) { return true; } } } return false; } /** * 返回数组中第一个非空元素 * * @param 数组元素类型 * @param array 数组 * @return 非空元素,如果不存在非空元素或数组为空,返回{@code null} * @since 3.0.7 */ @SuppressWarnings("unchecked") public static T firstNonNull(T... array) { if (isNotEmpty(array)) { for (final T val : array) { if (null != val) { return val; } } } return null; } /** * 新建一个空数组 * * @param 数组元素类型 * @param componentType 元素类型 * @param newSize 大小 * @return 空数组 */ @SuppressWarnings("unchecked") public static T[] newArray(Class componentType, int newSize) { return (T[]) Array.newInstance(componentType, newSize); } /** * 新建一个空数组 * * @param 数组元素类型 * @param newSize 大小 * @return 空数组 * @since 3.3.0 */ @SuppressWarnings("unchecked") public static T[] newArray(int newSize) { return (T[])new Object[newSize]; } /** * 获取数组对象的元素类型 * * @param array 数组对象 * @return 元素类型 * @since 3.2.2 */ public static Class getComponentType(Object array){ return null == array ? null : array.getClass().getComponentType(); } /** * 获取数组对象的元素类型 * * @param arrayClass 数组类 * @return 元素类型 * @since 3.2.2 */ public static Class getComponentType(Class arrayClass){ return null == arrayClass ? null : arrayClass.getComponentType(); } /** * 根据数组元素类型,获取数组的类型
* 方法是通过创建一个空数组从而获取其类型 * * @param componentType 数组元素类型 * @return 数组类型 * @since 3.2.2 */ public static Class getArrayType(Class componentType) { return newArray(componentType, 0).getClass(); } /** * 强转数组类型
* 强制转换的前提是数组元素类型可被强制转换
* 强制转换后会生成一个新数组 * * @param type 数组类型或数组元素类型 * @param arrayObj 原数组 * @return 转换后的数组类型 * @throws NullPointerException 提供参数为空 * @throws IllegalArgumentException 参数arrayObj不是数组 * @since 3.0.6 */ public static Object[] cast(Class type, Object arrayObj) throws NullPointerException, IllegalArgumentException { if (null == arrayObj) { throw new NullPointerException("Argument [arrayObj] is null !"); } if (false == arrayObj.getClass().isArray()) { throw new IllegalArgumentException("Argument [arrayObj] is not array !"); } if (null == type) { return (Object[]) arrayObj; } final Class componentType = type.isArray() ? type.getComponentType() : type; final Object[] array = (Object[]) arrayObj; final Object[] result = ArrayUtil.newArray(componentType, array.length); System.arraycopy(array, 0, result, 0, array.length); return result; } /** * 将新元素添加到已有数组中
* 添加新元素会生成一个新的数组,不影响原数组 * * @param 数组元素类型 * @param buffer 已有数组 * @param newElements 新元素 * @return 新数组 */ @SafeVarargs public static T[] append(T[] buffer, T... newElements) { if (isEmpty(newElements)) { return buffer; } T[] t = resize(buffer, buffer.length + newElements.length); System.arraycopy(newElements, 0, t, buffer.length, newElements.length); return t; } /** * 生成一个新的重新设置大小的数组
* 调整大小后拷贝原数组到新数组下。扩大则占位前N个位置,缩小则截断 * * @param 数组元素类型 * @param buffer 原数组 * @param newSize 新的数组大小 * @param componentType 数组元素类型 * @return 调整后的新数组 */ public static T[] resize(T[] buffer, int newSize, Class componentType) { T[] newArray = newArray(componentType, newSize); if (isNotEmpty(buffer)) { System.arraycopy(buffer, 0, newArray, 0, Math.min(buffer.length, newSize)); } return newArray; } /** * 生成一个新的重新设置大小的数组
* 新数组的类型为原数组的类型,调整大小后拷贝原数组到新数组下。扩大则占位前N个位置,缩小则截断 * * @param 数组元素类型 * @param buffer 原数组 * @param newSize 新的数组大小 * @return 调整后的新数组 */ public static T[] resize(T[] buffer, int newSize) { return resize(buffer, newSize, buffer.getClass().getComponentType()); } /** * 将多个数组合并在一起
* 忽略null的数组 * * @param 数组元素类型 * @param arrays 数组集合 * @return 合并后的数组 */ @SafeVarargs public static T[] addAll(T[]... arrays) { if (arrays.length == 1) { return arrays[0]; } int length = 0; for (T[] array : arrays) { if (array == null) { continue; } length += array.length; } T[] result = newArray(arrays.getClass().getComponentType().getComponentType(), length); length = 0; for (T[] array : arrays) { if (array == null) { continue; } System.arraycopy(array, 0, result, length, array.length); length += array.length; } return result; } /** * 包装 {@link System#arraycopy(Object, int, Object, int, int)}
* 数组复制 * * @param src 源数组 * @param srcPos 源数组开始位置 * @param dest 目标数组 * @param destPos 目标数组开始位置 * @param length 拷贝数组长度 * @return 目标数组 * @since 3.0.6 */ public static Object copy(Object src, int srcPos, Object dest, int destPos, int length) { System.arraycopy(src, srcPos, dest, destPos, length); return dest; } /** * 包装 {@link System#arraycopy(Object, int, Object, int, int)}
* 数组复制,缘数组和目标数组都是从位置0开始复制 * * @param src 源数组 * @param dest 目标数组 * @param length 拷贝数组长度 * @return 目标数组 * @since 3.0.6 */ public static Object copy(Object src, Object dest, int length) { System.arraycopy(src, 0, dest, 0, length); return dest; } /** * 克隆数组 * * @param 数组元素类型 * @param array 被克隆的数组 * @return 新数组 */ public static T[] clone(T[] array) { if (array == null) { return null; } return array.clone(); } /** * 克隆数组,如果非数组返回null * * @param 数组元素类型 * @param obj 数组对象 * @return 克隆后的数组对象 */ @SuppressWarnings("unchecked") public static T clone(final T obj) { if (null == obj) { return null; } if (isArray(obj)) { final Object result; final Class componentType = obj.getClass().getComponentType(); if (componentType.isPrimitive()) {// 原始类型 int length = Array.getLength(obj); result = Array.newInstance(componentType, length); while (length-- > 0) { Array.set(result, length, Array.get(obj, length)); } } else { result = ((Object[]) obj).clone(); } return (T) result; } return null; } /** * 生成一个从0开始的数字列表
* * @param excludedEnd 结束的数字(不包含) * @return 数字列表 */ public static int[] range(int excludedEnd) { return range(0, excludedEnd, 1); } /** * 生成一个数字列表
* 自动判定正序反序 * * @param includedStart 开始的数字(包含) * @param excludedEnd 结束的数字(不包含) * @return 数字列表 */ public static int[] range(int includedStart, int excludedEnd) { return range(includedStart, excludedEnd, 1); } /** * 生成一个数字列表
* 自动判定正序反序 * * @param includedStart 开始的数字(包含) * @param excludedEnd 结束的数字(不包含) * @param step 步进 * @return 数字列表 */ public static int[] range(int includedStart, int excludedEnd, int step) { if (includedStart > excludedEnd) { int tmp = includedStart; includedStart = excludedEnd; excludedEnd = tmp; } if (step <= 0) { step = 1; } int deviation = excludedEnd - includedStart; int length = deviation / step; if (deviation % step != 0) { length += 1; } int[] range = new int[length]; for (int i = 0; i < length; i++) { range[i] = includedStart; includedStart += step; } return range; } /** * 拆分byte数组为几个等份(最后一份可能小于len) * * @param array 数组 * @param len 每个小节的长度 * @return 拆分后的数组 */ public static byte[][] split(byte[] array, int len) { int x = array.length / len; int y = array.length % len; int z = 0; if (y != 0) { z = 1; } byte[][] arrays = new byte[x + z][]; byte[] arr; for (int i = 0; i < x + z; i++) { arr = new byte[len]; if (i == x + z - 1 && y != 0) { System.arraycopy(array, i * len, arr, 0, y); } else { System.arraycopy(array, i * len, arr, 0, len); } arrays[i] = arr; } return arrays; } /** * 过滤
* 过滤过程通过传入的Editor实现来返回需要的元素内容,这个Editor实现可以实现以下功能: * *
	 * 1、过滤出需要的对象,如果返回null表示这个元素对象抛弃
	 * 2、修改元素对象,返回集合中为修改后的对象
	 * 
* * @param 数组元素类型 * @param array 数组 * @param editor 编辑器接口 * @return 过滤后的数组 */ public static T[] filter(T[] array, Editor editor) { ArrayList list = new ArrayList(array.length); T modified; for (T t : array) { modified = editor.edit(t); if (null != modified) { list.add(modified); } } return list.toArray(Arrays.copyOf(array, list.size())); } /** * 过滤
* 过滤过程通过传入的Filter实现来过滤返回需要的元素内容,这个Editor实现可以实现以下功能: * *
	 * 1、过滤出需要的对象,{@link Filter#accept(Object)}方法返回true的对象将被加入结果集合中
	 * 
* * @param 数组元素类型 * @param array 数组 * @param filter 过滤器接口,用于定义过滤规则 * @return 过滤后的数组 * @since 3.2.1 */ public static T[] filter(T[] array, Filter filter) { ArrayList list = new ArrayList(array.length); boolean isAccept; for (T t : array) { isAccept = filter.accept(t); if (isAccept) { list.add(t); } } return list.toArray(Arrays.copyOf(array, list.size())); } /** * 去除{@code null} 元素 * @param array 数组 * @return 处理后的数组 * @since 3.2.2 */ public static T[] removeNull(T[] array) { return filter(array, new Editor() { @Override public T edit(T t) { //返回null便不加入集合 return t; }}); } /** * 去除{@code null}或者"" 元素 * @param array 数组 * @return 处理后的数组 * @since 3.2.2 */ public static T[] removeEmpty(T[] array) { return filter(array, new Filter() { @Override public boolean accept(T t) { return false == StrUtil.isEmpty(t); }}); } /** * 去除{@code null}或者""或者空白字符串 元素 * @param array 数组 * @return 处理后的数组 * @since 3.2.2 */ public static T[] removeBlank(T[] array) { return filter(array, new Filter() { @Override public boolean accept(T t) { return false == StrUtil.isBlank(t); }}); } /** * 数组元素中的null转换为"" * * @param array 数组 * @return 新数组 * @since 3.2.1 */ public static String[] nullToEmpty(String[] array){ return filter(array, new Editor() { @Override public String edit(String t) { return null == t ? StrUtil.EMPTY : t; }}); } /** * 映射键值(参考Python的zip()函数)
* 例如:
* keys = [a,b,c,d]
* values = [1,2,3,4]
* 则得到的Map是 {a=1, b=2, c=3, d=4}
* 如果两个数组长度不同,则只对应最短部分 * * @param Key类型 * @param Value类型 * @param keys 键列表 * @param values 值列表 * @param isOrder 是否有序 * @return Map * @since 3.0.4 */ public static Map zip(K[] keys, V[] values, boolean isOrder) { if (isEmpty(keys) || isEmpty(values)) { return null; } final int size = Math.min(keys.length, values.length); final Map map = CollectionUtil.newHashMap(size, isOrder); for (int i = 0; i < size; i++) { map.put(keys[i], values[i]); } return map; } /** * 映射键值(参考Python的zip()函数),返回Map无序
* 例如:
* keys = [a,b,c,d]
* values = [1,2,3,4]
* 则得到的Map是 {a=1, b=2, c=3, d=4}
* 如果两个数组长度不同,则只对应最短部分 * * @param Key类型 * @param Value类型 * @param keys 键列表 * @param values 值列表 * @return Map */ public static Map zip(K[] keys, V[] values) { return zip(keys, values, false); } // ------------------------------------------------------------------- indexOf and lastIndexOf and contains /** * 返回数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param 数组类型 * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int indexOf(T[] array, Object value) { for (int i = 0; i < array.length; i++) { if (ObjectUtil.equal(value, array[i])) { return i; } } return INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在位置,忽略大小写,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.1.2 */ public static int indexOfIgnoreCase(CharSequence[] array, CharSequence value) { for (int i = 0; i < array.length; i++) { if (StrUtil.equalsIgnoreCase(array[i], value)) { return i; } } return INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在最后的位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param 数组类型 * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int lastIndexOf(T[] array, Object value) { for (int i = array.length - 1; i >= 0; i--) { if (ObjectUtil.equal(value, array[i])) { return i; } } return INDEX_NOT_FOUND; } /** * 数组中是否包含元素 * * @param 数组元素类型 * * @param array 数组 * @param value 被检查的元素 * @return 是否包含 */ public static boolean contains(T[] array, T value) { return indexOf(array, value) > INDEX_NOT_FOUND; } /** * 数组中是否包含元素,忽略大小写 * * @param array 数组 * @param value 被检查的元素 * @return 是否包含 * @since 3.1.2 */ public static boolean containsIgnoreCase(CharSequence[] array, CharSequence value) { return indexOfIgnoreCase(array, value) > INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int indexOf(long[] array, long value) { for (int i = 0; i < array.length; i++) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在最后的位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int lastIndexOf(long[] array, long value) { for (int i = array.length - 1; i >= 0; i--) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 数组中是否包含元素 * * @param array 数组 * @param value 被检查的元素 * @return 是否包含 * @since 3.0.7 */ public static boolean contains(long[] array, long value) { return indexOf(array, value) > INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int indexOf(int[] array, int value) { for (int i = 0; i < array.length; i++) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在最后的位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int lastIndexOf(int[] array, int value) { for (int i = array.length - 1; i >= 0; i--) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 数组中是否包含元素 * * @param array 数组 * @param value 被检查的元素 * @return 是否包含 * @since 3.0.7 */ public static boolean contains(int[] array, int value) { return indexOf(array, value) > INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int indexOf(short[] array, short value) { for (int i = 0; i < array.length; i++) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在最后的位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int lastIndexOf(short[] array, short value) { for (int i = array.length - 1; i >= 0; i--) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 数组中是否包含元素 * * @param array 数组 * @param value 被检查的元素 * @return 是否包含 * @since 3.0.7 */ public static boolean contains(short[] array, short value) { return indexOf(array, value) > INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int indexOf(char[] array, char value) { for (int i = 0; i < array.length; i++) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在最后的位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int lastIndexOf(char[] array, char value) { for (int i = array.length - 1; i >= 0; i--) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 数组中是否包含元素 * * @param array 数组 * @param value 被检查的元素 * @return 是否包含 * @since 3.0.7 */ public static boolean contains(char[] array, char value) { return indexOf(array, value) > INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int indexOf(byte[] array, byte value) { for (int i = 0; i < array.length; i++) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在最后的位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int lastIndexOf(byte[] array, byte value) { for (int i = array.length - 1; i >= 0; i--) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 数组中是否包含元素 * * @param array 数组 * @param value 被检查的元素 * @return 是否包含 * @since 3.0.7 */ public static boolean contains(byte[] array, byte value) { return indexOf(array, value) > INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int indexOf(double[] array, double value) { for (int i = 0; i < array.length; i++) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在最后的位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int lastIndexOf(double[] array, double value) { for (int i = array.length - 1; i >= 0; i--) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 数组中是否包含元素 * * @param array 数组 * @param value 被检查的元素 * @return 是否包含 * @since 3.0.7 */ public static boolean contains(double[] array, double value) { return indexOf(array, value) > INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int indexOf(float[] array, float value) { for (int i = 0; i < array.length; i++) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在最后的位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int lastIndexOf(float[] array, float value) { for (int i = array.length - 1; i >= 0; i--) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 数组中是否包含元素 * * @param array 数组 * @param value 被检查的元素 * @return 是否包含 * @since 3.0.7 */ public static boolean contains(float[] array, float value) { return indexOf(array, value) > INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int indexOf(boolean[] array, boolean value) { for (int i = 0; i < array.length; i++) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 返回数组中指定元素所在最后的位置,未找到返回{@link #INDEX_NOT_FOUND} * * @param array 数组 * @param value 被检查的元素 * @return 数组中指定元素所在位置,未找到返回{@link #INDEX_NOT_FOUND} * @since 3.0.7 */ public static int lastIndexOf(boolean[] array, boolean value) { for (int i = array.length - 1; i >= 0; i--) { if (value == array[i]) { return i; } } return INDEX_NOT_FOUND; } /** * 数组中是否包含元素 * * @param array 数组 * @param value 被检查的元素 * @return 是否包含 * @since 3.0.7 */ public static boolean contains(boolean[] array, boolean value) { return indexOf(array, value) > INDEX_NOT_FOUND; } // ------------------------------------------------------------------- Wrap and unwrap /** * 将原始类型数组包装为包装类型 * * @param values 原始类型数组 * @return 包装类型数组 */ public static Integer[] wrap(int... values) { final int length = values.length; Integer[] array = new Integer[length]; for (int i = 0; i < length; i++) { array[i] = Integer.valueOf(values[i]); } return array; } /** * 包装类数组转为原始类型数组 * * @param values 包装类型数组 * @return 原始类型数组 */ public static int[] unWrap(Integer... values) { final int length = values.length; int[] array = new int[length]; for (int i = 0; i < length; i++) { array[i] = values[i].intValue(); } return array; } /** * 将原始类型数组包装为包装类型 * * @param values 原始类型数组 * @return 包装类型数组 */ public static Long[] wrap(long... values) { final int length = values.length; Long[] array = new Long[length]; for (int i = 0; i < length; i++) { array[i] = Long.valueOf(values[i]); } return array; } /** * 包装类数组转为原始类型数组 * * @param values 包装类型数组 * @return 原始类型数组 */ public static long[] unWrap(Long... values) { final int length = values.length; long[] array = new long[length]; for (int i = 0; i < length; i++) { array[i] = values[i].longValue(); } return array; } /** * 将原始类型数组包装为包装类型 * * @param values 原始类型数组 * @return 包装类型数组 */ public static Character[] wrap(char... values) { final int length = values.length; Character[] array = new Character[length]; for (int i = 0; i < length; i++) { array[i] = Character.valueOf(values[i]); } return array; } /** * 包装类数组转为原始类型数组 * * @param values 包装类型数组 * @return 原始类型数组 */ public static char[] unWrap(Character... values) { final int length = values.length; char[] array = new char[length]; for (int i = 0; i < length; i++) { array[i] = values[i].charValue(); } return array; } /** * 将原始类型数组包装为包装类型 * * @param values 原始类型数组 * @return 包装类型数组 */ public static Byte[] wrap(byte... values) { final int length = values.length; Byte[] array = new Byte[length]; for (int i = 0; i < length; i++) { array[i] = Byte.valueOf(values[i]); } return array; } /** * 包装类数组转为原始类型数组 * * @param values 包装类型数组 * @return 原始类型数组 */ public static byte[] unWrap(Byte... values) { final int length = values.length; byte[] array = new byte[length]; for (int i = 0; i < length; i++) { array[i] = values[i].byteValue(); } return array; } /** * 将原始类型数组包装为包装类型 * * @param values 原始类型数组 * @return 包装类型数组 */ public static Short[] wrap(short... values) { final int length = values.length; Short[] array = new Short[length]; for (int i = 0; i < length; i++) { array[i] = Short.valueOf(values[i]); } return array; } /** * 包装类数组转为原始类型数组 * * @param values 包装类型数组 * @return 原始类型数组 */ public static short[] unWrap(Short... values) { final int length = values.length; short[] array = new short[length]; for (int i = 0; i < length; i++) { array[i] = values[i].shortValue(); } return array; } /** * 将原始类型数组包装为包装类型 * * @param values 原始类型数组 * @return 包装类型数组 */ public static Float[] wrap(float... values) { final int length = values.length; Float[] array = new Float[length]; for (int i = 0; i < length; i++) { array[i] = Float.valueOf(values[i]); } return array; } /** * 包装类数组转为原始类型数组 * * @param values 包装类型数组 * @return 原始类型数组 */ public static float[] unWrap(Float... values) { final int length = values.length; float[] array = new float[length]; for (int i = 0; i < length; i++) { array[i] = values[i].floatValue(); } return array; } /** * 将原始类型数组包装为包装类型 * * @param values 原始类型数组 * @return 包装类型数组 */ public static Double[] wrap(double... values) { final int length = values.length; Double[] array = new Double[length]; for (int i = 0; i < length; i++) { array[i] = Double.valueOf(values[i]); } return array; } /** * 包装类数组转为原始类型数组 * * @param values 包装类型数组 * @return 原始类型数组 */ public static double[] unWrap(Double... values) { final int length = values.length; double[] array = new double[length]; for (int i = 0; i < length; i++) { array[i] = values[i].doubleValue(); } return array; } /** * 将原始类型数组包装为包装类型 * * @param values 原始类型数组 * @return 包装类型数组 */ public static Boolean[] wrap(boolean... values) { final int length = values.length; Boolean[] array = new Boolean[length]; for (int i = 0; i < length; i++) { array[i] = Boolean.valueOf(values[i]); } return array; } /** * 包装类数组转为原始类型数组 * * @param values 包装类型数组 * @return 原始类型数组 */ public static boolean[] unWrap(Boolean... values) { final int length = values.length; boolean[] array = new boolean[length]; for (int i = 0; i < length; i++) { array[i] = values[i].booleanValue(); } return array; } /** * 包装数组对象 * * @param obj 对象,可以是对象数组或者基本类型数组 * @return 包装类型数组或对象数组 * @throws UtilException 对象为非数组 */ public static Object[] wrap(Object obj) { if (isArray(obj)) { try { return (Object[]) obj; } catch (Exception e) { final String className = obj.getClass().getComponentType().getName(); switch (className) { case "long": return wrap((long[]) obj); case "int": return wrap((int[]) obj); case "short": return wrap((short[]) obj); case "char": return wrap((char[]) obj); case "byte": return wrap((byte[]) obj); case "boolean": return wrap((boolean[]) obj); case "float": return wrap((float[]) obj); case "double": return wrap((double[]) obj); default: throw new UtilException(e); } } } throw new UtilException(StrUtil.format("[{}] is not Array!", obj.getClass())); } /** * 对象是否为数组对象 * * @param obj 对象 * @return 是否为数组对象,如果为{@code null} 返回false */ public static boolean isArray(Object obj) { if (null == obj) { // throw new NullPointerException("Object check for isArray is null"); return false; } return obj.getClass().isArray(); } /** * 数组或集合转String * * @param obj 集合或数组对象 * @return 数组字符串,与集合转字符串格式相同 */ public static String toString(Object obj) { if (null == obj) { return null; } if (ArrayUtil.isArray(obj)) { try { return Arrays.deepToString((Object[]) obj); } catch (Exception e) { final String className = obj.getClass().getComponentType().getName(); switch (className) { case "long": return Arrays.toString((long[]) obj); case "int": return Arrays.toString((int[]) obj); case "short": return Arrays.toString((short[]) obj); case "char": return Arrays.toString((char[]) obj); case "byte": return Arrays.toString((byte[]) obj); case "boolean": return Arrays.toString((boolean[]) obj); case "float": return Arrays.toString((float[]) obj); case "double": return Arrays.toString((double[]) obj); default: throw new UtilException(e); } } } return obj.toString(); } /** * 获取数组长度
* 如果参数为{@code null},返回0 * *
	 * ArrayUtil.length(null)            = 0
	 * ArrayUtil.length([])              = 0
	 * ArrayUtil.length([null])          = 1
	 * ArrayUtil.length([true, false])   = 2
	 * ArrayUtil.length([1, 2, 3])       = 3
	 * ArrayUtil.length(["a", "b", "c"]) = 3
	 * 
* * @param array 数组对象 * @return 数组长度 * @throws IllegalArgumentException 如果参数不为数组,抛出此异常 * @since 3.0.8 * @see Array#getLength(Object) */ public static int length(Object array) throws IllegalArgumentException { if (null == array) { return 0; } return Array.getLength(array); } /** * 以 conjunction 为分隔符将数组转换为字符串 * * @param 被处理的集合 * @param array 数组 * @param conjunction 分隔符 * @return 连接后的字符串 */ public static String join(T[] array, CharSequence conjunction) { if (null == array) { return null; } final StringBuilder sb = new StringBuilder(); boolean isFirst = true; for (T item : array) { if (isFirst) { isFirst = false; } else { sb.append(conjunction); } if (ArrayUtil.isArray(item)) { sb.append(join(ArrayUtil.wrap(item), conjunction)); } else if (item instanceof Iterable) { sb.append(CollectionUtil.join((Iterable) item, conjunction)); } else if (item instanceof Iterator) { sb.append(CollectionUtil.join((Iterator) item, conjunction)); } else { sb.append(item); } } return sb.toString(); } /** * 以 conjunction 为分隔符将数组转换为字符串 * * @param array 数组 * @param conjunction 分隔符 * @return 连接后的字符串 */ public static String join(long[] array, String conjunction) { if (null == array) { return null; } final StringBuilder sb = new StringBuilder(); boolean isFirst = true; for (long item : array) { if (isFirst) { isFirst = false; } else { sb.append(conjunction); } sb.append(item); } return sb.toString(); } /** * 以 conjunction 为分隔符将数组转换为字符串 * * @param array 数组 * @param conjunction 分隔符 * @return 连接后的字符串 */ public static String join(int[] array, String conjunction) { if (null == array) { return null; } final StringBuilder sb = new StringBuilder(); boolean isFirst = true; for (int item : array) { if (isFirst) { isFirst = false; } else { sb.append(conjunction); } sb.append(item); } return sb.toString(); } /** * 以 conjunction 为分隔符将数组转换为字符串 * * @param array 数组 * @param conjunction 分隔符 * @return 连接后的字符串 */ public static String join(short[] array, String conjunction) { if (null == array) { return null; } final StringBuilder sb = new StringBuilder(); boolean isFirst = true; for (short item : array) { if (isFirst) { isFirst = false; } else { sb.append(conjunction); } sb.append(item); } return sb.toString(); } /** * 以 conjunction 为分隔符将数组转换为字符串 * * @param array 数组 * @param conjunction 分隔符 * @return 连接后的字符串 */ public static String join(char[] array, String conjunction) { if (null == array) { return null; } final StringBuilder sb = new StringBuilder(); boolean isFirst = true; for (char item : array) { if (isFirst) { isFirst = false; } else { sb.append(conjunction); } sb.append(item); } return sb.toString(); } /** * 以 conjunction 为分隔符将数组转换为字符串 * * @param array 数组 * @param conjunction 分隔符 * @return 连接后的字符串 */ public static String join(byte[] array, String conjunction) { if (null == array) { return null; } final StringBuilder sb = new StringBuilder(); boolean isFirst = true; for (byte item : array) { if (isFirst) { isFirst = false; } else { sb.append(conjunction); } sb.append(item); } return sb.toString(); } /** * 以 conjunction 为分隔符将数组转换为字符串 * * @param array 数组 * @param conjunction 分隔符 * @return 连接后的字符串 */ public static String join(boolean[] array, String conjunction) { if (null == array) { return null; } final StringBuilder sb = new StringBuilder(); boolean isFirst = true; for (boolean item : array) { if (isFirst) { isFirst = false; } else { sb.append(conjunction); } sb.append(item); } return sb.toString(); } /** * 以 conjunction 为分隔符将数组转换为字符串 * * @param array 数组 * @param conjunction 分隔符 * @return 连接后的字符串 */ public static String join(float[] array, String conjunction) { if (null == array) { return null; } final StringBuilder sb = new StringBuilder(); boolean isFirst = true; for (float item : array) { if (isFirst) { isFirst = false; } else { sb.append(conjunction); } sb.append(item); } return sb.toString(); } /** * 以 conjunction 为分隔符将数组转换为字符串 * * @param array 数组 * @param conjunction 分隔符 * @return 连接后的字符串 */ public static String join(double[] array, String conjunction) { if (null == array) { return null; } final StringBuilder sb = new StringBuilder(); boolean isFirst = true; for (double item : array) { if (isFirst) { isFirst = false; } else { sb.append(conjunction); } sb.append(item); } return sb.toString(); } /** * 以 conjunction 为分隔符将数组转换为字符串 * * @param array 数组 * @param conjunction 分隔符 * @return 连接后的字符串 */ public static String join(Object array, CharSequence conjunction) { if (isArray(array)) { final Class componentType = array.getClass().getComponentType(); if (componentType.isPrimitive()) { final String componentTypeName = componentType.getName(); switch (componentTypeName) { case "long": return join((long[]) array, conjunction); case "int": return join((int[]) array, conjunction); case "short": return join((short[]) array, conjunction); case "char": return join((char[]) array, conjunction); case "byte": return join((byte[]) array, conjunction); case "boolean": return join((boolean[]) array, conjunction); case "float": return join((float[]) array, conjunction); case "double": return join((double[]) array, conjunction); default: throw new UtilException("Unknown primitive type: [{}]", componentTypeName); } } else { return join((Object[]) array, conjunction); } } throw new UtilException(StrUtil.format("[{}] is not a Array!", array.getClass())); } /** * {@link ByteBuffer} 转byte数组 * * @param bytebuffer {@link ByteBuffer} * @return byte数组 * @since 3.0.1 */ public static byte[] toArray(ByteBuffer bytebuffer) { if (false == bytebuffer.hasArray()) { int oldPosition = bytebuffer.position(); bytebuffer.position(0); int size = bytebuffer.limit(); byte[] buffers = new byte[size]; bytebuffer.get(buffers); bytebuffer.position(oldPosition); return buffers; } else { return Arrays.copyOfRange(bytebuffer.array(), bytebuffer.position(), bytebuffer.limit()); } } /** * 将集合转为数组 * * @param 数组元素类型 * @param iterator {@link Iterator} * @param componentType 集合元素类型 * @return 数组 * @since 3.0.9 */ public static T[] toArray(Iterator iterator, Class componentType) { return toArray(CollectionUtil.newArrayList(iterator), componentType); } /** * 将集合转为数组 * * @param 数组元素类型 * @param iterable {@link Iterable} * @param componentType 集合元素类型 * @return 数组 * @since 3.0.9 */ public static T[] toArray(Iterable iterable, Class componentType) { return toArray(CollectionUtil.toCollection(iterable), componentType); } /** * 将集合转为数组 * * @param 数组元素类型 * @param collection 集合 * @param componentType 集合元素类型 * @return 数组 * @since 3.0.9 */ public static T[] toArray(Collection collection, Class componentType) { final T[] array = newArray(componentType, collection.size()); return collection.toArray(array); } // ---------------------------------------------------------------------- remove /** * 移除数组中对应位置的元素
* copy from commons-lang * * @param 数组元素类型 * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param index 位置,如果位置小于0或者大于长度,返回原数组 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ @SuppressWarnings("unchecked") public static T[] remove(T[] array, int index) throws IllegalArgumentException { return (T[]) remove((Object) array, index); } /** * 移除数组中对应位置的元素
* copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param index 位置,如果位置小于0或者大于长度,返回原数组 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static long[] remove(long[] array, int index) throws IllegalArgumentException { return (long[]) remove((Object) array, index); } /** * 移除数组中对应位置的元素
* copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param index 位置,如果位置小于0或者大于长度,返回原数组 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static int[] remove(int[] array, int index) throws IllegalArgumentException { return (int[]) remove((Object) array, index); } /** * 移除数组中对应位置的元素
* copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param index 位置,如果位置小于0或者大于长度,返回原数组 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static short[] remove(short[] array, int index) throws IllegalArgumentException { return (short[]) remove((Object) array, index); } /** * 移除数组中对应位置的元素
* copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param index 位置,如果位置小于0或者大于长度,返回原数组 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static char[] remove(char[] array, int index) throws IllegalArgumentException { return (char[]) remove((Object) array, index); } /** * 移除数组中对应位置的元素
* copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param index 位置,如果位置小于0或者大于长度,返回原数组 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static byte[] remove(byte[] array, int index) throws IllegalArgumentException { return (byte[]) remove((Object) array, index); } /** * 移除数组中对应位置的元素
* copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param index 位置,如果位置小于0或者大于长度,返回原数组 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static double[] remove(double[] array, int index) throws IllegalArgumentException { return (double[]) remove((Object) array, index); } /** * 移除数组中对应位置的元素
* copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param index 位置,如果位置小于0或者大于长度,返回原数组 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static float[] remove(float[] array, int index) throws IllegalArgumentException { return (float[]) remove((Object) array, index); } /** * 移除数组中对应位置的元素
* copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param index 位置,如果位置小于0或者大于长度,返回原数组 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static boolean[] remove(boolean[] array, int index) throws IllegalArgumentException { return (boolean[]) remove((Object) array, index); } /** * 移除数组中对应位置的元素
* copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param index 位置,如果位置小于0或者大于长度,返回原数组 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static Object remove(Object array, int index) throws IllegalArgumentException { if (null == array) { return array; } int length = length(array); if (index < 0 || index >= length) { return array; } final Object result = Array.newInstance(array.getClass().getComponentType(), length - 1); System.arraycopy(array, 0, result, 0, index); if (index < length - 1) { // 后半部分 System.arraycopy(array, index + 1, result, index, length - index - 1); } return result; } // ---------------------------------------------------------------------- remove /** * 移除数组中指定的元素
* 只会移除匹配到的第一个元素 copy from commons-lang * * @param 数组元素类型 * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param element 要移除的元素 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static T[] removeEle(T[] array, T element) throws IllegalArgumentException { return remove(array, indexOf(array, element)); } /** * 移除数组中指定的元素
* 只会移除匹配到的第一个元素 copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param element 要移除的元素 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static long[] removeEle(long[] array, long element) throws IllegalArgumentException { return remove(array, indexOf(array, element)); } /** * 移除数组中指定的元素
* 只会移除匹配到的第一个元素 copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param element 要移除的元素 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static int[] removeEle(int[] array, int element) throws IllegalArgumentException { return remove(array, indexOf(array, element)); } /** * 移除数组中指定的元素
* 只会移除匹配到的第一个元素 copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param element 要移除的元素 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static short[] removeEle(short[] array, short element) throws IllegalArgumentException { return remove(array, indexOf(array, element)); } /** * 移除数组中指定的元素
* 只会移除匹配到的第一个元素 copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param element 要移除的元素 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static char[] removeEle(char[] array, char element) throws IllegalArgumentException { return remove(array, indexOf(array, element)); } /** * 移除数组中指定的元素
* 只会移除匹配到的第一个元素 copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param element 要移除的元素 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static byte[] removeEle(byte[] array, byte element) throws IllegalArgumentException { return remove(array, indexOf(array, element)); } /** * 移除数组中指定的元素
* 只会移除匹配到的第一个元素 copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param element 要移除的元素 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static double[] removeEle(double[] array, double element) throws IllegalArgumentException { return remove(array, indexOf(array, element)); } /** * 移除数组中指定的元素
* 只会移除匹配到的第一个元素 copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param element 要移除的元素 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static float[] removeEle(float[] array, float element) throws IllegalArgumentException { return remove(array, indexOf(array, element)); } /** * 移除数组中指定的元素
* 只会移除匹配到的第一个元素 copy from commons-lang * * @param array 数组对象,可以是对象数组,也可以原始类型数组 * @param element 要移除的元素 * @return 去掉指定元素后的新数组或原数组 * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ public static boolean[] removeEle(boolean[] array, boolean element) throws IllegalArgumentException { return remove(array, indexOf(array, element)); } //------------------------------------------------------------------------------------------------------------ Reverse array /** * 反转数组,会变更原数组 * * @param 数组元素类型 * @param array 数组,会变更 * @param startIndexInclusive 其实位置(包含) * @param endIndexExclusive 结束位置(不包含) * @return 变更后的原数组 * @since 3.0.9 */ public static T[] reverse(final T[] array, final int startIndexInclusive, final int endIndexExclusive) { if (isEmpty(array)) { return array; } int i = startIndexInclusive < 0 ? 0 : startIndexInclusive; int j = Math.min(array.length, endIndexExclusive) - 1; T tmp; while (j > i) { tmp = array[j]; array[j] = array[i]; array[i] = tmp; j--; i++; } return array; } /** * 反转数组,会变更原数组 * * @param 数组元素类型 * @param array 数组,会变更 * @return 变更后的原数组 * @since 3.0.9 */ public static T[] reverse(final T[] array) { return reverse(array, 0, array.length); } /** * 反转数组,会变更原数组 * * @param array 数组,会变更 * @param startIndexInclusive 其实位置(包含) * @param endIndexExclusive 结束位置(不包含) * @return 变更后的原数组 * @since 3.0.9 */ public static long[] reverse(final long[] array, final int startIndexInclusive, final int endIndexExclusive) { if (isEmpty(array)) { return array; } int i = startIndexInclusive < 0 ? 0 : startIndexInclusive; int j = Math.min(array.length, endIndexExclusive) - 1; long tmp; while (j > i) { tmp = array[j]; array[j] = array[i]; array[i] = tmp; j--; i++; } return array; } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @return 变更后的原数组 * @since 3.0.9 */ public static long[] reverse(final long[] array) { return reverse(array, 0, array.length); } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @param startIndexInclusive 其实位置(包含) * @param endIndexExclusive 结束位置(不包含) * @return 变更后的原数组 * @since 3.0.9 */ public static int[] reverse(final int[] array, final int startIndexInclusive, final int endIndexExclusive) { if (isEmpty(array)) { return array; } int i = startIndexInclusive < 0 ? 0 : startIndexInclusive; int j = Math.min(array.length, endIndexExclusive) - 1; int tmp; while (j > i) { tmp = array[j]; array[j] = array[i]; array[i] = tmp; j--; i++; } return array; } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @return 变更后的原数组 * @since 3.0.9 */ public static int[] reverse(final int[] array) { return reverse(array, 0, array.length); } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @param startIndexInclusive 其实位置(包含) * @param endIndexExclusive 结束位置(不包含) * @return 变更后的原数组 * @since 3.0.9 */ public static short[] reverse(final short[] array, final int startIndexInclusive, final int endIndexExclusive) { if (isEmpty(array)) { return array; } int i = startIndexInclusive < 0 ? 0 : startIndexInclusive; int j = Math.min(array.length, endIndexExclusive) - 1; short tmp; while (j > i) { tmp = array[j]; array[j] = array[i]; array[i] = tmp; j--; i++; } return array; } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @return 变更后的原数组 * @since 3.0.9 */ public static short[] reverse(final short[] array) { return reverse(array, 0, array.length); } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @param startIndexInclusive 其实位置(包含) * @param endIndexExclusive 结束位置(不包含) * @return 变更后的原数组 * @since 3.0.9 */ public static char[] reverse(final char[] array, final int startIndexInclusive, final int endIndexExclusive) { if (isEmpty(array)) { return array; } int i = startIndexInclusive < 0 ? 0 : startIndexInclusive; int j = Math.min(array.length, endIndexExclusive) - 1; char tmp; while (j > i) { tmp = array[j]; array[j] = array[i]; array[i] = tmp; j--; i++; } return array; } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @return 变更后的原数组 * @since 3.0.9 */ public static char[] reverse(final char[] array) { return reverse(array, 0, array.length); } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @param startIndexInclusive 其实位置(包含) * @param endIndexExclusive 结束位置(不包含) * @return 变更后的原数组 * @since 3.0.9 */ public static byte[] reverse(final byte[] array, final int startIndexInclusive, final int endIndexExclusive) { if (isEmpty(array)) { return array; } int i = startIndexInclusive < 0 ? 0 : startIndexInclusive; int j = Math.min(array.length, endIndexExclusive) - 1; byte tmp; while (j > i) { tmp = array[j]; array[j] = array[i]; array[i] = tmp; j--; i++; } return array; } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @return 变更后的原数组 * @since 3.0.9 */ public static byte[] reverse(final byte[] array) { return reverse(array, 0, array.length); } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @param startIndexInclusive 其实位置(包含) * @param endIndexExclusive 结束位置(不包含) * @return 变更后的原数组 * @since 3.0.9 */ public static double[] reverse(final double[] array, final int startIndexInclusive, final int endIndexExclusive) { if (isEmpty(array)) { return array; } int i = startIndexInclusive < 0 ? 0 : startIndexInclusive; int j = Math.min(array.length, endIndexExclusive) - 1; double tmp; while (j > i) { tmp = array[j]; array[j] = array[i]; array[i] = tmp; j--; i++; } return array; } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @return 变更后的原数组 * @since 3.0.9 */ public static double[] reverse(final double[] array) { return reverse(array, 0, array.length); } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @param startIndexInclusive 其实位置(包含) * @param endIndexExclusive 结束位置(不包含) * @return 变更后的原数组 * @since 3.0.9 */ public static float[] reverse(final float[] array, final int startIndexInclusive, final int endIndexExclusive) { if (isEmpty(array)) { return array; } int i = startIndexInclusive < 0 ? 0 : startIndexInclusive; int j = Math.min(array.length, endIndexExclusive) - 1; float tmp; while (j > i) { tmp = array[j]; array[j] = array[i]; array[i] = tmp; j--; i++; } return array; } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @return 变更后的原数组 * @since 3.0.9 */ public static float[] reverse(final float[] array) { return reverse(array, 0, array.length); } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @param startIndexInclusive 其实位置(包含) * @param endIndexExclusive 结束位置(不包含) * @return 变更后的原数组 * @since 3.0.9 */ public static boolean[] reverse(final boolean[] array, final int startIndexInclusive, final int endIndexExclusive) { if (isEmpty(array)) { return array; } int i = startIndexInclusive < 0 ? 0 : startIndexInclusive; int j = Math.min(array.length, endIndexExclusive) - 1; boolean tmp; while (j > i) { tmp = array[j]; array[j] = array[i]; array[i] = tmp; j--; i++; } return array; } /** * 反转数组,会变更原数组 * @param array 数组,会变更 * @return 变更后的原数组 * @since 3.0.9 */ public static boolean[] reverse(final boolean[] array) { return reverse(array, 0, array.length); } //------------------------------------------------------------------------------------------------------------ min and max /** * 取最小值 * * @param 元素类型 * @param numberArray 数字数组 * @return 最小值 * @since 3.0.9 */ public static > T min(T[] numberArray) { T min = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(ObjectUtil.compare(min, numberArray[i]) > 0) { min = numberArray[i]; } } return min; } /** * 取最小值 * @param numberArray 数字数组 * @return 最小值 * @since 3.0.9 */ public static long min(long[] numberArray) { long min = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(min > numberArray[i]) { min = numberArray[i]; } } return min; } /** * 取最小值 * @param numberArray 数字数组 * @return 最小值 * @since 3.0.9 */ public static int min(int[] numberArray) { int min = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(min > numberArray[i]) { min = numberArray[i]; } } return min; } /** * 取最小值 * @param numberArray 数字数组 * @return 最小值 * @since 3.0.9 */ public static short min(short[] numberArray) { short min = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(min > numberArray[i]) { min = numberArray[i]; } } return min; } /** * 取最小值 * @param numberArray 数字数组 * @return 最小值 * @since 3.0.9 */ public static char min(char[] numberArray) { char min = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(min > numberArray[i]) { min = numberArray[i]; } } return min; } /** * 取最小值 * @param numberArray 数字数组 * @return 最小值 * @since 3.0.9 */ public static byte min(byte[] numberArray) { byte min = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(min > numberArray[i]) { min = numberArray[i]; } } return min; } /** * 取最小值 * @param numberArray 数字数组 * @return 最小值 * @since 3.0.9 */ public static double min(double[] numberArray) { double min = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(min > numberArray[i]) { min = numberArray[i]; } } return min; } /** * 取最小值 * @param numberArray 数字数组 * @return 最小值 * @since 3.0.9 */ public static float min(float[] numberArray) { float min = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(min > numberArray[i]) { min = numberArray[i]; } } return min; } /** * 取最大值 * * @param 元素类型 * @param numberArray 数字数组 * @return 最大值 * @since 3.0.9 */ public static > T max(T[] numberArray) { T max = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(ObjectUtil.compare(max, numberArray[i]) < 0) { max = numberArray[i]; } } return max; } /** * 取最大值 * @param numberArray 数字数组 * @return 最大值 * @since 3.0.9 */ public static long max(long[] numberArray) { long max = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(max < numberArray[i]) { max = numberArray[i]; } } return max; } /** * 取最大值 * @param numberArray 数字数组 * @return 最大值 * @since 3.0.9 */ public static int max(int[] numberArray) { int max = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(max < numberArray[i]) { max = numberArray[i]; } } return max; } /** * 取最大值 * @param numberArray 数字数组 * @return 最大值 * @since 3.0.9 */ public static short max(short[] numberArray) { short max = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(max < numberArray[i]) { max = numberArray[i]; } } return max; } /** * 取最大值 * @param numberArray 数字数组 * @return 最大值 * @since 3.0.9 */ public static char max(char[] numberArray) { char max = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(max < numberArray[i]) { max = numberArray[i]; } } return max; } /** * 取最大值 * @param numberArray 数字数组 * @return 最大值 * @since 3.0.9 */ public static byte max(byte[] numberArray) { byte max = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(max < numberArray[i]) { max = numberArray[i]; } } return max; } /** * 取最大值 * @param numberArray 数字数组 * @return 最大值 * @since 3.0.9 */ public static double max(double[] numberArray) { double max = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(max < numberArray[i]) { max = numberArray[i]; } } return max; } /** * 取最大值 * @param numberArray 数字数组 * @return 最大值 * @since 3.0.9 */ public static float max(float[] numberArray) { float max = numberArray[0]; for(int i = 0; i < numberArray.length; i++) { if(max < numberArray[i]) { max = numberArray[i]; } } return max; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy