
dev.utils.common.CollectionUtils Maven / Gradle / Ivy
package dev.utils.common;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import dev.utils.JCLogUtils;
/**
* detail: 集合工具类 ( Collection - List、Set、Queue ) 等
* @author Ttt
*
* // 升序
* Collections.sort(list);
* // 降序
* Collections.sort(list, Collections.reverseOrder());
* // 逆序
* Collections.reverse(list);
* // 创建不可修改集合
* Collections.unmodifiableList()
* Arrays.asList()
*
*/
public final class CollectionUtils {
private CollectionUtils() {
}
// 日志 TAG
private static final String TAG = CollectionUtils.class.getSimpleName();
// ==============
// = Collection =
// ==============
/**
* 判断 Collection 是否为 null
* @param collection {@link Collection}
* @return {@code true} yes, {@code false} no
*/
public static boolean isEmpty(final Collection> collection) {
return (collection == null || collection.isEmpty());
}
/**
* 判断 Collection 是否不为 null
* @param collection {@link Collection}
* @return {@code true} yes, {@code false} no
*/
public static boolean isNotEmpty(final Collection> collection) {
return (collection != null && !collection.isEmpty());
}
// ==========
// = 判断长度 =
// ==========
/**
* 获取 Collection 长度
* @param collection {@link Collection}
* @return 如果 Collection 为 null, 则返回默认长度, 如果不为 null, 则返回 collection.size()
*/
public static int length(final Collection> collection) {
return length(collection, 0);
}
/**
* 获取 Collection 长度
* @param collection {@link Collection}
* @param defaultLength 集合为 null 默认长度
* @return 如果 Collection 为 null, 则返回 defaultLength, 如果不为 null, 则返回 collection.size()
*/
public static int length(
final Collection> collection,
final int defaultLength
) {
return collection != null ? collection.size() : defaultLength;
}
// =
/**
* 获取长度 Collection 是否等于期望长度
* @param collection {@link Collection}
* @param length 期望长度
* @return {@code true} yes, {@code false} no
*/
public static boolean isLength(
final Collection> collection,
final int length
) {
return collection != null && collection.size() == length;
}
// =
/**
* 判断 Collection 长度是否大于指定长度
* @param collection {@link Collection}
* @param length 指定长度
* @return {@code true} yes, {@code false} no
*/
public static boolean greaterThan(
final Collection> collection,
final int length
) {
return collection != null && collection.size() > length;
}
/**
* 判断 Collection 长度是否大于等于指定长度
* @param collection {@link Collection}
* @param length 指定长度
* @return {@code true} yes, {@code false} no
*/
public static boolean greaterThanOrEqual(
final Collection> collection,
final int length
) {
return collection != null && collection.size() >= length;
}
// =
/**
* 判断 Collection 长度是否小于指定长度
* @param collection {@link Collection}
* @param length 指定长度
* @return {@code true} yes, {@code false} no
*/
public static boolean lessThan(
final Collection> collection,
final int length
) {
return collection != null && collection.size() < length;
}
/**
* 判断 Collection 长度是否小于等于指定长度
* @param collection {@link Collection}
* @param length 指定长度
* @return {@code true} yes, {@code false} no
*/
public static boolean lessThanOrEqual(
final Collection> collection,
final int length
) {
return collection != null && collection.size() <= length;
}
// =============
// = 获取长度总和 =
// =============
/**
* 获取 Collection 数组长度总和
* @param collections Collection[]
* @return Collection 数组长度总和
*/
public static int getCount(final Collection>... collections) {
if (collections == null) return 0;
int count = 0;
for (Collection> collection : collections) {
count += length(collection);
}
return count;
}
// ==========
// = 数据获取 =
// ==========
/**
* 获取数据
* @param collection {@link Collection}
* @param pos 索引
* @param 泛型
* @return 对应索引的值
*/
public static T get(
final Collection collection,
final int pos
) {
if (collection != null) {
// 防止索引为负数
if (pos < 0) {
return null;
}
if (collection instanceof List) {
try {
return (T) ((List) collection).get(pos);
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "get %s", pos);
}
} else {
try {
return (T) collection.toArray()[pos];
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "get %s", pos);
}
}
}
return null;
}
/**
* 获取第一条数据
* @param collection {@link Collection}
* @param 泛型
* @return 索引为 0 的值
*/
public static T getFirst(final Collection collection) {
return get(collection, 0);
}
/**
* 获取最后一条数据
* @param collection {@link Collection}
* @param 泛型
* @return 索引 length - 1 的值
*/
public static T getLast(final Collection collection) {
return get(collection, length(collection) - 1);
}
// =
/**
* 根据指定 value 获取 value 所在位置 + 偏移量的值
* @param collection {@link Collection}
* @param value 值
* @param number 符合条件次数 ( 从 0 开始, 0 = 1 )
* @param notNull 是否不允许值为 null
* @param offset 偏移量
* @param 泛型
* @return 对应索引的值
*/
public static T get(
final Collection collection,
final T value,
final int number,
final boolean notNull,
final int offset
) {
if (collection != null) {
if (notNull && value == null) {
return null;
}
try {
// 保存当前临时次数
int temp = number;
// 转换数组
T[] arrays = (T[]) collection.toArray();
// 进行循环判断
for (int i = 0, len = arrays.length; i < len; i++) {
T t = arrays[i];
// 判断值是否一样
if (equals(t, value)) {
if (temp - 1 < 0) {
return arrays[i + offset];
}
temp--;
}
}
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "get");
}
}
return null;
}
/**
* 根据指定 value 获取 value 所在位置 + 偏移量的索引
* @param collection {@link Collection}
* @param value 值
* @param number 符合条件次数 ( 从 0 开始, 0 = 1 )
* @param notNull 是否不允许值为 null
* @param offset 偏移量
* @param 泛型
* @return 对应的索引
*/
public static int getPosition(
final Collection collection,
final T value,
final int number,
final boolean notNull,
final int offset
) {
if (collection != null) {
if (notNull && value == null) {
return -1;
}
try {
// 保存当前临时次数
int temp = number;
// 转换数组
T[] arrays = (T[]) collection.toArray();
// 进行循环判断
for (int i = 0, len = arrays.length; i < len; i++) {
T t = arrays[i];
// 判断值是否一样
if (equals(t, value)) {
if (temp - 1 < 0) {
return i + offset;
}
temp--;
}
}
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "getPosition");
}
}
return -1;
}
// =
/**
* 根据指定 value 获取索引
* @param collection {@link Collection}
* @param value 值
* @param 泛型
* @return 对应的索引
*/
public static int getPosition(
final Collection collection,
final T value
) {
return getPosition(collection, value, 0, false, 0);
}
/**
* 根据指定 value 获取索引
* @param collection {@link Collection}
* @param value 值
* @param number 符合条件次数 ( 从 0 开始, 0 = 1 )
* @param 泛型
* @return 对应的索引
*/
public static int getPosition(
final Collection collection,
final T value,
final int number
) {
return getPosition(collection, value, number, false, 0);
}
/**
* 根据指定 value 获取索引
* @param collection {@link Collection}
* @param value 值
* @param notNull 是否不允许值为 null
* @param 泛型
* @return 对应的索引
*/
public static int getPosition(
final Collection collection,
final T value,
final boolean notNull
) {
return getPosition(collection, value, 0, notNull, 0);
}
/**
* 根据指定 value 获取索引
* @param collection {@link Collection}
* @param value 值
* @param number 符合条件次数 ( 从 0 开始, 0 = 1 )
* @param notNull 是否不允许值为 null
* @param 泛型
* @return 对应的索引
*/
public static int getPosition(
final Collection collection,
final T value,
final int number,
final boolean notNull
) {
return getPosition(collection, value, number, notNull, 0);
}
// =
/**
* 根据指定 value 获取索引, 不允许值为 null
* @param collection {@link Collection}
* @param value 值
* @param 泛型
* @return 对应的索引
*/
public static int getPositionNotNull(
final Collection collection,
final T value
) {
return getPosition(collection, value, 0, true, 0);
}
/**
* 根据指定 value 获取索引, 不允许值为 null
* @param collection {@link Collection}
* @param value 值
* @param number 符合条件次数 ( 从 0 开始, 0 = 1 )
* @param 泛型
* @return 对应的索引
*/
public static int getPositionNotNull(
final Collection collection,
final T value,
final int number
) {
return getPosition(collection, value, number, true, 0);
}
// =
/**
* 根据指定 value 获取 value 所在位置的下一个值
* @param collection {@link Collection}
* @param value 值
* @param 泛型
* @return 对应索引的值
*/
public static T getNext(
final Collection collection,
final T value
) {
return get(collection, value, 0, false, 1);
}
/**
* 根据指定 value 获取 value 所在位置的下一个值
* @param collection {@link Collection}
* @param value 值
* @param number 符合条件次数 ( 从 0 开始, 0 = 1 )
* @param 泛型
* @return 对应索引的值
*/
public static T getNext(
final Collection collection,
final T value,
final int number
) {
return get(collection, value, number, false, 1);
}
/**
* 根据指定 value 获取 value 所在位置的下一个值
* @param collection {@link Collection}
* @param value 值
* @param notNull 是否不允许值为 null
* @param 泛型
* @return 对应索引的值
*/
public static T getNext(
final Collection collection,
final T value,
final boolean notNull
) {
return get(collection, value, 0, notNull, 1);
}
/**
* 根据指定 value 获取 value 所在位置的下一个值
* @param collection {@link Collection}
* @param value 值
* @param number 符合条件次数 ( 从 0 开始, 0 = 1 )
* @param notNull 是否不允许值为 null
* @param 泛型
* @return 对应索引的值
*/
public static T getNext(
final Collection collection,
final T value,
final int number,
final boolean notNull
) {
return get(collection, value, number, notNull, 1);
}
// =
/**
* 根据指定 value 获取 value 所在位置的下一个值, 不允许值为 null
* @param collection {@link Collection}
* @param value 值
* @param 泛型
* @return 对应索引的值
*/
public static T getNextNotNull(
final Collection collection,
final T value
) {
return get(collection, value, 0, true, 1);
}
/**
* 根据指定 value 获取 value 所在位置的下一个值, 不允许值为 null
* @param collection {@link Collection}
* @param value 值
* @param number 符合条件次数 ( 从 0 开始, 0 = 1 )
* @param 泛型
* @return 对应索引的值
*/
public static T getNextNotNull(
final Collection collection,
final T value,
final int number
) {
return get(collection, value, number, true, 1);
}
// =
/**
* 根据指定 value 获取 value 所在位置的上一个值
* @param collection {@link Collection}
* @param value 值
* @param 泛型
* @return 对应索引的值
*/
public static T getPrevious(
final Collection collection,
final T value
) {
return get(collection, value, 0, false, -1);
}
/**
* 根据指定 value 获取 value 所在位置的上一个值
* @param collection {@link Collection}
* @param value 值
* @param number 符合条件次数 ( 从 0 开始, 0 = 1 )
* @param 泛型
* @return 对应索引的值
*/
public static T getPrevious(
final Collection collection,
final T value,
final int number
) {
return get(collection, value, number, false, -1);
}
/**
* 根据指定 value 获取 value 所在位置的上一个值
* @param collection {@link Collection}
* @param value 值
* @param notNull 是否不允许值为 null
* @param 泛型
* @return 对应索引的值
*/
public static T getPrevious(
final Collection collection,
final T value,
final boolean notNull
) {
return get(collection, value, 0, notNull, -1);
}
/**
* 根据指定 value 获取 value 所在位置的上一个值
* @param collection {@link Collection}
* @param value 值
* @param number 符合条件次数 ( 从 0 开始, 0 = 1 )
* @param notNull 是否不允许值为 null
* @param 泛型
* @return 对应索引的值
*/
public static T getPrevious(
final Collection collection,
final T value,
final int number,
final boolean notNull
) {
return get(collection, value, number, notNull, -1);
}
// =
/**
* 根据指定 value 获取 value 所在位置的上一个值, 不允许值为 null
* @param collection {@link Collection}
* @param value 值
* @param 泛型
* @return 对应索引的值
*/
public static T getPreviousNotNull(
final Collection collection,
final T value
) {
return get(collection, value, 0, true, -1);
}
/**
* 根据指定 value 获取 value 所在位置的上一个值, 不允许值为 null
* @param collection {@link Collection}
* @param value 值
* @param number 符合条件次数 ( 从 0 开始, 0 = 1 )
* @param 泛型
* @return 对应索引的值
*/
public static T getPreviousNotNull(
final Collection collection,
final T value,
final int number
) {
return get(collection, value, number, true, -1);
}
// ==========
// = 添加数据 =
// ==========
/**
* 添加一条数据
* @param collection {@link Collection}
* @param value 值
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean add(
final Collection collection,
final T value
) {
return add(collection, value, false);
}
/**
* 添加一条数据 ( value 不允许为 null )
* @param collection {@link Collection}
* @param value 值
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean addNotNull(
final Collection collection,
final T value
) {
return add(collection, value, true);
}
/**
* 添加一条数据
* @param collection {@link Collection}
* @param value 值
* @param notNull 是否不允许添加 null 数据
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean add(
final Collection collection,
final T value,
final boolean notNull
) {
if (collection != null) {
if (notNull) {
if (value != null) {
try {
return collection.add(value);
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "add notNull");
}
}
} else {
try {
return collection.add(value);
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "add");
}
}
}
return false;
}
// =
/**
* 添加集合数据
* @param collection {@link Collection}
* @param values 准备添加的值 ( 集合 )
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean addAll(
final Collection collection,
final Collection values
) {
return addAll(collection, values, false);
}
/**
* 添加集合数据 ( values 内的值不允许为 null )
* @param collection {@link Collection}
* @param values 准备添加的值 ( 集合 )
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean addAllNotNull(
final Collection collection,
final Collection values
) {
return addAll(collection, values, true);
}
/**
* 添加集合数据
* @param collection {@link Collection}
* @param values 准备添加的值 ( 集合 )
* @param notNull 是否不允许添加 null 值
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean addAll(
final Collection collection,
final Collection values,
final boolean notNull
) {
if (collection != null && values != null) {
if (notNull) {
try {
for (T value : values) {
if (value != null) {
collection.add(value);
}
}
return true;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "addAll notNull");
}
} else {
try {
return collection.addAll(values);
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "addAll");
}
}
}
return false;
}
// =
/**
* 移除全部数据并添加集合数据
* @param collection {@link Collection}
* @param values 准备添加的值 ( 集合 )
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean clearAndAddAll(
final Collection collection,
final Collection values
) {
return clearAndAddAll(collection, values, false);
}
/**
* 移除全部数据并添加集合数据 ( values 内的值不允许为 null )
* @param collection {@link Collection}
* @param values 准备添加的值 ( 集合 )
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean clearAndAddAllNotNull(
final Collection collection,
final Collection values
) {
return clearAndAddAll(collection, values, true);
}
/**
* 移除全部数据并添加集合数据
* @param collection {@link Collection}
* @param values 准备添加的值 ( 集合 )
* @param notNull 是否不允许添加 null 值
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean clearAndAddAll(
final Collection collection,
final Collection values,
final boolean notNull
) {
clearAll(collection);
return addAll(collection, values, notNull);
}
// =========================
// = 添加数据到指定索引 (List) =
// =========================
/**
* 添加一条数据到指定索引后
* @param index 索引
* @param list 集合
* @param value 值
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean add(
final int index,
final List list,
final T value
) {
return add(index, list, value, false);
}
/**
* 添加一条数据到指定索引后 ( value 不允许为 null )
* @param index 索引
* @param list 集合
* @param value 值
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean addNotNull(
final int index,
final List list,
final T value
) {
return add(index, list, value, true);
}
/**
* 添加一条数据到指定索引后
* @param index 索引
* @param list 集合
* @param value 值
* @param notNull 是否不允许添加 null 数据
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean add(
final int index,
final List list,
final T value,
final boolean notNull
) {
if (list != null) {
if (notNull) {
if (value != null) {
try {
list.add(index, value);
return true;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "add notNull");
}
}
} else {
try {
list.add(index, value);
return true;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "add");
}
}
}
return false;
}
// =
/**
* 添加集合数据到指定索引后
* @param index 索引
* @param list 集合
* @param values 准备添加的值 ( 集合 )
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean addAll(
final int index,
final List list,
final List values
) {
return addAll(index, list, values, false);
}
/**
* 添加集合数据到指定索引后 ( values 内的值不允许为 null )
* @param index 索引
* @param list 集合
* @param values 准备添加的值 ( 集合 )
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean addAllNotNull(
final int index,
final List list,
final List values
) {
return addAll(index, list, values, true);
}
/**
* 添加集合数据到指定索引后
* @param index 索引
* @param list 集合
* @param values 准备添加的值 ( 集合 )
* @param notNull 是否不允许添加 null 值
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean addAll(
final int index,
final List list,
final List values,
final boolean notNull
) {
if (list != null && values != null) {
if (notNull) {
try {
List tempList = new ArrayList<>();
for (T value : values) {
if (value != null) {
tempList.add(value);
}
}
// 添加到集合中
list.addAll(index, tempList);
return true;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "addAll notNull");
}
} else {
try {
list.addAll(index, values);
return true;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "addAll");
}
}
}
return false;
}
// ==========
// = 删除数据 =
// ==========
/**
* 移除一条数据
* @param collection {@link Collection}
* @param value 准备删除的值
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean remove(
final Collection collection,
final T value
) {
if (collection != null) {
try {
return collection.remove(value);
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "remove");
}
}
return false;
}
/**
* 移除一条数据
* @param list 集合
* @param pos 准备删除的索引
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static T remove(
final List list,
final int pos
) {
if (list != null) {
// 防止索引为负数
if (pos < 0) {
return null;
}
try {
return list.remove(pos);
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "remove");
}
}
return null;
}
/**
* 移除集合数据
* @param collection {@link Collection}
* @param values 准备删除的集合
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean removeAll(
final Collection collection,
final Collection values
) {
if (collection != null && values != null) {
try {
return collection.removeAll(values);
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "removeAll");
}
}
return false;
}
// =
/**
* 清空集合中符合指定 value 的全部数据
* @param collection {@link Collection}
* @param value 准备对比移除的值
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean clear(
final Collection collection,
final T value
) {
if (collection != null) {
try {
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
T t = iterator.next();
// 判断值是否一样
if (equals(t, value)) {
iterator.remove();
}
}
return true;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "clear");
}
}
return false;
}
/**
* 保留集合中符合指定 value 的全部数据
* @param collection {@link Collection}
* @param value 准备对比保留的值
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean clearNotBelong(
final Collection collection,
final T value
) {
if (collection != null) {
try {
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
T t = iterator.next();
// 判断值是否不一样 ( 移除不一样的 )
if (!equals(t, value)) {
iterator.remove();
}
}
return true;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "clearNotBelong");
}
}
return false;
}
/**
* 清空集合全部数据
* @param collection {@link Collection}
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean clearAll(final Collection collection) {
if (collection != null) {
try {
collection.clear();
return true;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "clearAll");
}
}
return false;
}
/**
* 清空集合中为 null 的值
* @param collection {@link Collection}
* @param 泛型
* @return {@code true} success, {@code false} fail
*/
public static boolean clearNull(final Collection collection) {
return clear(collection, null);
}
// =================
// = 判断集合是否相同 =
// =================
/**
* 判断两个集合是否相同
* @param collection1 第一个集合
* @param collection2 第二个集合
* @param 泛型
* @return {@code true} yes, {@code false} no
*/
public static boolean isEqualCollection(
final Collection collection1,
final Collection collection2
) {
// 数据长度
int len;
// 判断数据是否相同
if (collection1 != null && collection2 != null && (len = collection1.size()) == collection2.size()) {
if (len == 0) return true;
// 进行判断类型, 如果不同, 则直接跳过不处理
if (!collection1.getClass().getName().equals(collection2.getClass().getName())) {
return false;
}
// 如果集合相等, 直接跳过
if (collection1.equals(collection2)) {
return true;
}
T[] arrays1, arrays2;
try {
// 转换数组, 防止异常
arrays1 = (T[]) collection1.toArray();
arrays2 = (T[]) collection2.toArray();
} catch (Exception e) {
return false;
}
for (int i = 0; i < len; i++) {
// 判断两个值是否一样
boolean equals = equals(arrays1[i], arrays2[i]);
// 如果不一样, 直接 return
if (!equals) {
return false;
}
}
return true;
}
// 如果不符合条件, 防止两个集合都是为 null
return (collection1 == null && collection2 == null);
}
/**
* 判断多个集合是否相同
* @param collections 集合数组
* @param 泛型
* @return {@code true} yes, {@code false} no
*/
public static boolean isEqualCollections(final Collection... collections) {
if (collections != null && collections.length >= 2) {
// 获取长度
int len = collections.length;
// 设置临时值为第一个
Collection temp = collections[0];
// 进行判断
for (int i = 1; i < len; i++) {
// 判断是否一样
boolean equalCollection = isEqualCollection(temp, collections[i]);
// 如果不一样, 直接返回
if (!equalCollection) {
return false;
}
}
return true;
}
return false;
}
// ==========
// = 集合处理 =
// ==========
// =======
// = 并集 =
// =======
/**
* 两个集合并集处理
* @param collection1 第一个集合
* @param collection2 第二个集合
* @param 泛型
* @return 并集集合
*/
public static Collection union(
final Collection collection1,
final Collection collection2
) {
if (collection1 != null && collection2 != null) {
try {
// 初始化新的集合, 默认保存第一个集合的数据
Set sets = new LinkedHashSet<>(collection1);
sets.addAll(collection2);
// 返回集合
return sets;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "union");
}
return null;
} else if (collection1 != null) {
return collection1;
}
return collection2;
}
/**
* 多个集合并集处理
* @param collections 集合数组
* @param 泛型
* @return 并集集合
*/
public static Collection unions(final Collection... collections) {
if (collections != null) {
int len = collections.length;
if (len >= 2) {
try {
// 保存第一个集合
Set sets = new LinkedHashSet<>();
// 防止集合为 null
if (collections[0] != null) {
sets.addAll(collections[0]);
}
// 进行循环处理
for (int i = 1; i < len; i++) {
// 获取集合值
Collection value = collections[i];
if (value != null) {
sets.addAll(value);
}
}
return sets;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "unions");
}
return null;
}
return collections[0];
}
return null;
}
// =======
// = 交集 =
// =======
/**
* 两个集合交集处理
* @param collection1 第一个集合
* @param collection2 第二个集合
* @param 泛型
* @return 交集集合
*/
public static Collection intersection(
final Collection collection1,
final Collection collection2
) {
if (collection1 != null && collection2 != null) {
try {
// 专门用于返回中转的集合
Set sets = new LinkedHashSet<>();
// 初始化新的集合, 默认保存第一个集合的数据
Set setsTemp = new LinkedHashSet<>(collection1);
// 循环第二个集合
for (T value : collection2) {
// 判断是否存在, 存在则保存
if (setsTemp.contains(value)) {
sets.add(value);
}
}
// 返回集合
return sets;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "intersection");
}
return null;
} else if (collection1 != null) {
return collection1;
}
return collection2;
}
/**
* 两个集合交集的补集处理
* @param collection1 第一个集合
* @param collection2 第二个集合
* @param 泛型
* @return 交集集合
*/
public static Collection disjunction(
final Collection collection1,
final Collection collection2
) {
try {
// 先进行并集处理
Collection unionC = union(collection1, collection2);
// 在进行交集处理
Collection intersectionC = intersection(collection1, collection2);
// 再进行移除处理
if (unionC != null && intersectionC != null) {
try {
// 移除数据
unionC.removeAll(intersectionC);
return unionC;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "disjunction");
}
}
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "disjunction");
}
return null;
}
/**
* 两个集合差集 ( 扣除 ) 处理
* @param collection1 第一个集合
* @param collection2 第二个集合
* @param 泛型
* @return 差集 ( 扣除 ) 集合
*/
public static Collection subtract(
final Collection collection1,
final Collection collection2
) {
try {
// 先进行交集处理
Collection intersectionC = intersection(collection1, collection2);
if (intersectionC != null) {
// 保存到新的集合中
Set sets = new LinkedHashSet<>(collection1);
// 进行移除
sets.removeAll(intersectionC);
// 返回集合
return sets;
}
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "subtract");
}
return null;
}
// ==========
// = 快捷方法 =
// ==========
/**
* 判断两个值是否一样
* @param value1 第一个值
* @param value2 第二个值
* @param 泛型
* @return {@code true} yes, {@code false} no
*/
public static boolean equals(
final T value1,
final T value2
) {
return ObjectUtils.equals(value1, value2);
}
// ==========
// = 转换处理 =
// ==========
/**
* 转换数组 to Object
* @param collection {@link Collection}
* @param 泛型
* @return 转换后的数组
*/
public static Object[] toArray(final Collection collection) {
if (collection != null) {
try {
return collection.toArray();
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "toArray");
}
}
return null;
}
/**
* 转换数组 to T
* @param collection {@link Collection}
* @param 泛型
* @return 转换后的泛型数组
*/
public static T[] toArrayT(final Collection collection) {
if (collection != null) {
try {
return new ArrayWithTypeToken(collection).create();
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "toArrayT");
}
}
return null;
}
/**
* 集合翻转处理
* @param collection {@link Collection}
* @param 泛型
* @return 翻转后的集合
*/
public static Collection reverse(final Collection collection) {
try {
// 返回集合
List lists = new ArrayList<>();
// 转换数据
T[] arrays = (T[]) collection.toArray();
// 循环处理
for (int i = arrays.length - 1; i >= 0; i--) {
lists.add(arrays[i]);
}
// 保存新的数据
return lists;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "reverse");
}
return null;
}
// ============
// = 最小值索引 =
// ============
/**
* 获取集合中最小值索引
* @param list 集合
* @return 最小值索引
*/
public static int getMinimumIndexI(final List list) {
if (list != null) {
int len = list.size();
if (len > 0) {
int index = 0;
Integer temp = list.get(index);
for (int i = 1; i < len; i++) {
Integer value = list.get(i);
if (value != null) {
if (temp == null) {
index = i;
temp = value;
}
if (value < temp) {
index = i;
temp = value;
}
}
}
if (temp == null) {
return -1;
}
return index;
}
}
return -1;
}
/**
* 获取集合中最小值索引
* @param list 集合
* @return 最小值索引
*/
public static int getMinimumIndexL(final List list) {
if (list != null) {
int len = list.size();
if (len > 0) {
int index = 0;
Long temp = list.get(index);
for (int i = 1; i < len; i++) {
Long value = list.get(i);
if (value != null) {
if (temp == null) {
index = i;
temp = value;
}
if (value < temp) {
index = i;
temp = value;
}
}
}
if (temp == null) {
return -1;
}
return index;
}
}
return -1;
}
/**
* 获取集合中最小值索引
* @param list 集合
* @return 最小值索引
*/
public static int getMinimumIndexF(final List list) {
if (list != null) {
int len = list.size();
if (len > 0) {
int index = 0;
Float temp = list.get(index);
for (int i = 1; i < len; i++) {
Float value = list.get(i);
if (value != null) {
if (temp == null) {
index = i;
temp = value;
}
if (value < temp) {
index = i;
temp = value;
}
}
}
if (temp == null) {
return -1;
}
return index;
}
}
return -1;
}
/**
* 获取集合中最小值索引
* @param list 集合
* @return 最小值索引
*/
public static int getMinimumIndexD(final List list) {
if (list != null) {
int len = list.size();
if (len > 0) {
int index = 0;
Double temp = list.get(index);
for (int i = 1; i < len; i++) {
Double value = list.get(i);
if (value != null) {
if (temp == null) {
index = i;
temp = value;
}
if (value < temp) {
index = i;
temp = value;
}
}
}
if (temp == null) {
return -1;
}
return index;
}
}
return -1;
}
// ============
// = 最大值索引 =
// ============
/**
* 获取集合中最大值索引
* @param list 集合
* @return 最大值索引
*/
public static int getMaximumIndexI(final List list) {
if (list != null) {
int len = list.size();
if (len > 0) {
int index = 0;
Integer temp = list.get(index);
for (int i = 1; i < len; i++) {
Integer value = list.get(i);
if (value != null) {
if (temp == null) {
index = i;
temp = value;
}
if (value > temp) {
index = i;
temp = value;
}
}
}
if (temp == null) {
return -1;
}
return index;
}
}
return -1;
}
/**
* 获取集合中最大值索引
* @param list 集合
* @return 最大值索引
*/
public static int getMaximumIndexL(final List list) {
if (list != null) {
int len = list.size();
if (len > 0) {
int index = 0;
Long temp = list.get(index);
for (int i = 1; i < len; i++) {
Long value = list.get(i);
if (value != null) {
if (temp == null) {
index = i;
temp = value;
}
if (value > temp) {
index = i;
temp = value;
}
}
}
if (temp == null) {
return -1;
}
return index;
}
}
return -1;
}
/**
* 获取集合中最大值索引
* @param list 集合
* @return 最大值索引
*/
public static int getMaximumIndexF(final List list) {
if (list != null) {
int len = list.size();
if (len > 0) {
int index = 0;
Float temp = list.get(index);
for (int i = 1; i < len; i++) {
Float value = list.get(i);
if (value != null) {
if (temp == null) {
index = i;
temp = value;
}
if (value > temp) {
index = i;
temp = value;
}
}
}
if (temp == null) {
return -1;
}
return index;
}
}
return -1;
}
/**
* 获取集合中最大值索引
* @param list 集合
* @return 最大值索引
*/
public static int getMaximumIndexD(final List list) {
if (list != null) {
int len = list.size();
if (len > 0) {
int index = 0;
Double temp = list.get(index);
for (int i = 1; i < len; i++) {
Double value = list.get(i);
if (value != null) {
if (temp == null) {
index = i;
temp = value;
}
if (value > temp) {
index = i;
temp = value;
}
}
}
if (temp == null) {
return -1;
}
return index;
}
}
return -1;
}
// ============
// = 获取最小值 =
// ============
/**
* 获取集合中最小值
* @param list 集合
* @return 最小值
*/
public static int getMinimumI(final List list) {
try {
return list.get(getMinimumIndexI(list));
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "getMinimumI");
}
return 0;
}
/**
* 获取集合中最小值
* @param list 集合
* @return 最小值
*/
public static long getMinimumL(final List list) {
try {
return list.get(getMinimumIndexL(list));
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "getMinimumL");
}
return 0L;
}
/**
* 获取集合中最小值
* @param list 集合
* @return 最小值
*/
public static float getMinimumF(final List list) {
try {
return list.get(getMinimumIndexF(list));
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "getMinimumF");
}
return 0F;
}
/**
* 获取集合中最小值
* @param list 集合
* @return 最小值
*/
public static double getMinimumD(final List list) {
try {
return list.get(getMinimumIndexD(list));
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "getMinimumD");
}
return 0D;
}
// ============
// = 获取最大值 =
// ============
/**
* 获取集合中最大值
* @param list 集合
* @return 最大值
*/
public static int getMaximumI(final List list) {
try {
return list.get(getMaximumIndexI(list));
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "getMaximumI");
}
return 0;
}
/**
* 获取集合中最大值
* @param list 集合
* @return 最大值
*/
public static long getMaximumL(final List list) {
try {
return list.get(getMaximumIndexL(list));
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "getMaximumL");
}
return 0L;
}
/**
* 获取集合中最大值
* @param list 集合
* @return 最大值
*/
public static float getMaximumF(final List list) {
try {
return list.get(getMaximumIndexF(list));
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "getMaximumF");
}
return 0F;
}
/**
* 获取集合中最大值
* @param list 集合
* @return 最大值
*/
public static double getMaximumD(final List list) {
try {
return list.get(getMaximumIndexD(list));
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "getMaximumD");
}
return 0D;
}
// =============
// = 计算集合总和 =
// =============
/**
* 计算集合总和
* @param lists 集合
* @return 集合总和
*/
public static int sumlistI(final List lists) {
return sumlistI(lists, 0, length(lists), 0);
}
/**
* 计算集合总和
* @param lists 集合
* @param end 结束位置
* @return 集合总和
*/
public static int sumlistI(
final List lists,
final int end
) {
return sumlistI(lists, 0, end, 0);
}
/**
* 计算集合总和
* @param lists 集合
* @param end 结束位置
* @param extra 额外值
* @return 集合总和
*/
public static int sumlistI(
final List lists,
final int end,
final int extra
) {
return sumlistI(lists, 0, end, extra);
}
/**
* 计算集合总和
* @param lists 集合
* @param start 开始位置
* @param end 结束位置
* @param extra 额外值
* @return 集合总和
*/
public static int sumlistI(
final List lists,
final int start,
final int end,
final int extra
) {
int total = 0;
if (lists != null) {
for (int i = start; i < end; i++) {
try {
total += (lists.get(i) + extra);
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "sumlistI");
}
}
}
return total;
}
// =
/**
* 计算集合总和
* @param lists 集合
* @return 集合总和
*/
public static long sumlistL(final List lists) {
return sumlistL(lists, 0, length(lists), 0);
}
/**
* 计算集合总和
* @param lists 集合
* @param end 结束位置
* @return 集合总和
*/
public static long sumlistL(
final List lists,
final int end
) {
return sumlistL(lists, 0, end, 0);
}
/**
* 计算集合总和
* @param lists 集合
* @param end 结束位置
* @param extra 额外值
* @return 集合总和
*/
public static long sumlistL(
final List lists,
final int end,
final long extra
) {
return sumlistL(lists, 0, end, extra);
}
/**
* 计算集合总和
* @param lists 集合
* @param start 开始位置
* @param end 结束位置
* @param extra 额外值
* @return 集合总和
*/
public static long sumlistL(
final List lists,
final int start,
final int end,
final long extra
) {
long total = 0L;
if (lists != null) {
for (int i = start; i < end; i++) {
try {
total += (lists.get(i) + extra);
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "sumlistL");
}
}
}
return total;
}
// =
/**
* 计算集合总和
* @param lists 集合
* @return 集合总和
*/
public static float sumlistF(final List lists) {
return sumlistF(lists, 0, length(lists), 0);
}
/**
* 计算集合总和
* @param lists 集合
* @param end 结束位置
* @return 集合总和
*/
public static float sumlistF(
final List lists,
final int end
) {
return sumlistF(lists, 0, end, 0);
}
/**
* 计算集合总和
* @param lists 集合
* @param end 结束位置
* @param extra 额外值
* @return 集合总和
*/
public static float sumlistF(
final List lists,
final int end,
final float extra
) {
return sumlistF(lists, 0, end, extra);
}
/**
* 计算集合总和
* @param lists 集合
* @param start 开始位置
* @param end 结束位置
* @param extra 额外值
* @return 集合总和
*/
public static float sumlistF(
final List lists,
final int start,
final int end,
final float extra
) {
float total = 0;
if (lists != null) {
for (int i = start; i < end; i++) {
try {
total += (lists.get(i) + extra);
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "sumlistF");
}
}
}
return total;
}
// =
/**
* 计算集合总和
* @param lists 集合
* @return 集合总和
*/
public static double sumlistD(final List lists) {
return sumlistD(lists, 0, length(lists), 0);
}
/**
* 计算集合总和
* @param lists 集合
* @param end 结束位置
* @return 集合总和
*/
public static double sumlistD(
final List lists,
final int end
) {
return sumlistD(lists, 0, end, 0);
}
/**
* 计算集合总和
* @param lists 集合
* @param end 结束位置
* @param extra 额外值
* @return 集合总和
*/
public static double sumlistD(
final List lists,
final int end,
final double extra
) {
return sumlistD(lists, 0, end, extra);
}
/**
* 计算集合总和
* @param lists 集合
* @param start 开始位置
* @param end 结束位置
* @param extra 额外值
* @return 集合总和
*/
public static double sumlistD(
final List lists,
final int start,
final int end,
final double extra
) {
double total = 0;
if (lists != null) {
for (int i = start; i < end; i++) {
try {
total += (lists.get(i) + extra);
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "sumlistD");
}
}
}
return total;
}
// ============
// = 内部实现类 =
// ============
/**
* detail: 持有数组 TypeToken 实体类
* @author Ttt
*/
public static class ArrayWithTypeToken {
// 泛型数组
private T[] array;
public ArrayWithTypeToken(Collection collection) {
newInstance(collection);
}
public ArrayWithTypeToken(
Class type,
int size
) {
newInstance(type, size);
}
/**
* 添加数据
* @param index 索引
* @param item 数据
*/
public void put(
final int index,
final T item
) {
array[index] = item;
}
/**
* 获取对应索引的数据
* @param index 索引
* @return 对应索引的数据
*/
public T get(final int index) {
return array[index];
}
/**
* 获取数组
* @return 泛型数组
*/
public T[] create() {
return array;
}
// ==========
// = 内部方法 =
// ==========
/**
* 创建数组方法
* @param type 数组类型
* @param size 数组长度
*/
private void newInstance(
final Class type,
final int size
) {
array = (T[]) Array.newInstance(type, size);
}
/**
* 创建数组方法
* @param collection 集合
*/
private void newInstance(final Collection collection) {
// 泛型实体类
T value = null;
// 数组
Object[] objects = collection.toArray();
// 获取不为 null 的泛型实体类
for (Object object : objects) {
if (object != null) {
value = (T) object;
break;
}
}
newInstance((Class) value.getClass(), objects.length);
// 保存数据
for (int i = 0, len = objects.length; i < len; i++) {
Object object = objects[i];
put(i, (object != null) ? (T) object : null);
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy