package com.jiajiao.utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
/**
* 数组操作辅助类,支持int,char,boject,String类型
*
*/
public class ArrayHelper {
/**
* 锁定创建
*/
private ArrayHelper() {
}
/**
*
* 计算数组中的单元数目或对象中的属性个数 当 arr 为 null 时返回 0。
*
* @param arr
* @return
*/
public static int sizeOf(int[] arr) {
return arr == null ? 0 : arr.length;
}
/**
*
* 合并一个或多个数组 当 arr 为 null 时返回 new int[0] 。
*
* @param arrs
* @return
*/
public static int[] merge(int[]... arrs) {
int[] result = new int[0];
if (arrs != null) {
int count = 0;
for (int i = 0; i < arrs.length; i++) {
count += arrs[i].length;
}
result = new int[count];
int arg;
int k = 0;
for (int i = 0; i < arrs.length; i++) {
if (arrs[i] == null) {
continue;
}
for (int j = 0; j < arrs[i].length; j++) {
arg = arrs[i][j];
result[k] = arg;
k++;
}
}
}
return result;
}
/**
*
* 计算数组的差集 注意: aArr 为null时 返回 bArr(可能为 null)。 bArr 为null时 返回 aArr。 无差集时返回
* new int[0];
*
* @param aArr
* @param bArr
* @return
*/
public static int[] diff(int[] aArr, int[] bArr) {
{
if (aArr == null) {
return bArr;
}
if (bArr == null) {
return aArr;
}
}
int[] cArr = new int[aArr.length + bArr.length];
int idx = 0;
/**
* 检查 a 中那些元 在 b 中不存在
*/
for (int i = 0; i < aArr.length; i++) {
if (!inArray(bArr, aArr[i])) {
cArr[idx++] = aArr[i];
}
}
/**
* 检查 b 中那些元 在 a 中不存在
*/
for (int i = 0; i < bArr.length; i++) {
if (!inArray(aArr, bArr[i])) {
cArr[idx++] = bArr[i];
}
}
//
int[] dArr = new int[idx];
System.arraycopy(cArr, 0, dArr, 0, dArr.length);
return dArr;
}
/**
*
* 返回一个数组的全复制 当 arr 为 null 时返回 new int[0] 。
*
* @param arr
* @return
*/
public static int[] copyOf(int[] arr) {
int[] carr = new int[0];
if (arr != null) {
carr = new int[arr.length];
System.arraycopy(arr, 0, carr, 0, arr.length);
}
return carr;
}
/**
*
* 返回一个数组的复制 当 arr 为 null 时返回 new int[0] 。
*
* @param arr
* @param i
* @return
*/
public static int[] copyOf(int[] arr, int i) {
int[] carr = new int[0];
if (arr != null) {
if (i > arr.length) {
i = arr.length;
}
carr = new int[i];
System.arraycopy(arr, 0, carr, 0, i);
}
return carr;
}
/**
*
* 创建一个Map,用一个数组的值作为其键名,另一个数组的值作为其值
* 当键为空或无单元时返回空Map,否则以键数组为主导填充Map。值不足时填充null。 注意:Map中键顺序并不一定与参数keys顺序相同。
*
* @param <T>
* @param <V>
* @param keys
* @param values
* @return
*/
public static <T, V> Map<T, V> combine(T[] keys, V[] values) {
Map<T, V> map = new HashMap<T, V>();
if (keys != null && keys.length > 0) {
int vsize = values == null ? 0 : values.length;
for (int i = 0; i < keys.length; i++) {
if (i >= vsize) {
map.put(keys[i], null);
} else {
map.put(keys[i], values[i]);
}
}
}
return map;
}
/**
*
* 从数组中随机取出一个或多个单元 当 arr 为 null 时返回 new int[0]。
*
* @param arr
* @return
*/
public static int[] random(int[] arr) {
if (arr == null) {
return new int[0];
}
int count = new Random().nextInt(arr.length);
count = count > 0 ? count : 1;
return random(arr, count);
}
/**
*
* 将数组打乱 当 arr 为 null 时返回 new int[0]。
*
* @param arr
* @return
*/
public static int[] shuffle(int[] arr) {
if (arr == null) {
return new int[0];
}
return random(arr, arr.length);
}
/**
*
* 随机取出固定数量的元素 如取出数量大于数组元素数则返回打乱的数组,等同于 {@link #shuffle} 当 arr 为 null 时返回
* new int[0]。
*
* @param arr
* @param count
* @return
*/
public static int[] random(int[] arr, int count) {
int[] rarr = new int[0];
if (arr != null) {
if (arr.length < count) {
count = arr.length;
}
Random random = new Random();
int i = 0;
int num = 0;
rarr = new int[count];
int[] keys = new int[count];
for (int j = 0; j < keys.length; j++) {
keys[j] = -1;
}
do {
num = random.nextInt(arr.length);
if (!inArray(keys, num)) {
keys[i] = num;
rarr[i] = arr[num];
i++;
}
} while (i < count);
}
return rarr;
}
/**
*
* 检查数组中是否存在某个值
*
* @param arr
* @param search
* @return
*/
public static boolean inArray(int[] arr, int search) {
if (arr != null) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == search) {
return true;
}
}
}
return false;
}
/**
*
* 检查数组中是否存在某几个值
*
* @param arr
* @param search
* @return
*/
public static boolean inArray(int[] arr, int[] search) {
if (search != null) {
for (int i = 0; i < search.length; i++) {
if (!inArray(arr, search[i])) {
return false;
}
}
return true;
}
return false;
}
/**
*
* 检查数组中是否存在某个值,并返回其索引键,不存在则返回 -1 。
*
* @param arr
* @param search
* @return
*/
public static int search(int[] arr, int search) {
if (arr != null) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == search) {
return i;
}
}
}
return -1;
}
/**
*
* 返回一个单元顺序相反的数组 当 arr 为 null 时返回 new int[0]。
*
* @param arr
* @return
*/
public static int[] reverse(int[] arr) {
int[] rarr = new int[0];
if (arr != null) {
rarr = new int[arr.length];
int j = 0;
for (int i = arr.length - 1; i >= 0; i--) {
rarr[j++] = arr[i];
}
}
return rarr;
}
/**
* 使用间隔符连接
*
* @param ints
* @param sep
* @return
*/
public static String join(int[] ints, String sep) {
StringBuilder strBuilder = new StringBuilder();
if (ints != null) {
for (int i = 0; i < ints.length; i++) {
strBuilder.append(ints[i]);
if (i < ints.length - 1) {
strBuilder.append(sep);
}
}
}
return strBuilder.toString();
}
/**
* 计算所有单元的合
*
* @param ints
* @param sep
* @return
*/
public static int sum(int[] ints) {
int sum = 0;
if (ints != null) {
for (int i = 0; i < ints.length; i++) {
sum += ints[i];
}
}
return sum;
}
/**
* char array tools =====================
*/
/**
*
* 计算数组中的单元数目或对象中的属性个数 当 arr 为 null 时返回 0。
*
* @param arr
* @return
*/
public static int sizeOf(char[] arr) {
return arr == null ? 0 : arr.length;
}
/**
*
* 合并一个或多个数组 当 arr 为 null 时返回 new char[0] 。
*
* @param arrs
* @return
*/
public static char[] merge(char[]... arrs) {
char[] result = new char[0];
if (arrs != null) {
char count = 0;
for (char i = 0; i < arrs.length; i++) {
count += arrs[i].length;
}
result = new char[count];
char arg;
char k = 0;
for (char i = 0; i < arrs.length; i++) {
if (arrs[i] == null) {
continue;
}
for (char j = 0; j < arrs[i].length; j++) {
arg = arrs[i][j];
result[k] = arg;
k++;
}
}
}
return result;
}
/**
*
* 计算数组的差集 注意: aArr 为null时 返回 bArr(可能为 null)。 bArr 为null时 返回 aArr。 无差集时返回
* new char[0];
*
* @param aArr
* @param bArr
* @return
*/
public static char[] diff(char[] aArr, char[] bArr) {
{
if (aArr == null) {
return bArr;
}
if (bArr == null) {
return