CollectionUtil集合工具类

​package com.uama.utils;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.commons.collections.CollectionUtils;

/**
 * 集合操作工具类
 *
 * @since 1.0
 */
public class CollectionUtil {

	private CollectionUtil() {
		throw new IllegalStateException("Utility class");
	}

	/**
	 * 判断集合是否非空
	 */
	public static boolean isNotEmpty(Collection collection) {
		return CollectionUtils.isNotEmpty(collection);
	}

	/**
	 * 判断集合是否为空
	 */
	public static boolean isEmpty(Collection collection) {
		return CollectionUtils.isEmpty(collection);
	}

	/**
	 * 拷贝集合
	 */
	public static  List deepCopy(List src) {
		if (src == null) {
			return null;
		}
		return src.stream().collect(Collectors.toList());
	}

	/**
	 * 获取交集
	 * 交集的获取方法:
	 * 例:
	 * 集合A:{1,2,3}
	 * 集合B:{3,4}
	 * 先获取集合A和集合B的差集C:{1,2}
	 * 再获取集合A和差集C的差集D:{3},差集D就是交集
	 * Added By Fangxm 2017.06.06
	 * @param from 集合A
	 * @param src 集合B
	 * @return
	 * @throws ClassNotFoundException
	 * @throws IOException
	 */
	public static  List intersection(final List a, final List b) {
		if (a == null || a.isEmpty()) {
			return null;
		}
		if (b == null || b.isEmpty()) {
			return null;
		}
		ArrayList list = new ArrayList<>();
		Map mapa = getCardinalityMap(a);
		Map mapb = getCardinalityMap(b);
		Set elts = new HashSet<>(a);
		elts.addAll(b); // addAll时会自动去重
		Iterator it = elts.iterator();
		while (it.hasNext()) {
			T obj = it.next();
			// 由于去过重了, list要add的次数是两者的较小值
			for (int i = 0, m = Math.min(getFreq(obj, mapa), getFreq(obj, mapb)); i < m; i++) {
				list.add(obj);
			}
		}
		return list;
	}
	/**
	 * 返回拥有相同obj的数量
	 * @param coll
	 * @return
	 */
	public static  Map getCardinalityMap(final List coll) {
		Map count = new HashMap<>();
		for (Iterator it = coll.iterator(); it.hasNext();) {
			T obj = it.next();
			Integer c = count.get(obj);
			if (c == null) {
				count.put(obj, 1);
			} else {
				count.put(obj, c.intValue() + 1);
			}
		}
		return count;
	}

	/**
	 * 获取差集
	 * 例:
	 * 集合A:{1,2,3}
	 * 集合B:{3,4}
	 * 集合A和集合B的差集C:{1,2}
	 * Added By Fangxm 2017.06.06
	 */
	public static  List differenceSet(List from, List src) {
		if (src == null || src.isEmpty()) {
			return from;
		}
		if (from == null || from.isEmpty()) {
			return from;
		}
		List dest = deepCopy(from);
		return removeAll(dest, src);
	}

}

 

你可能感兴趣的:(Java开发)