ConvertUtil.java 3.27 KB
package com.bsth.util;

import com.google.common.collect.ArrayListMultimap;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;
import java.util.*;

/**
 * 数据转换
 * Created by panzhao on 2017/3/13.
 */
public class ConvertUtil<T> {

    Logger logger = LoggerFactory.getLogger(this.getClass());
    private static DateTimeFormatter fmtyyyyMMdd = DateTimeFormat.forPattern("yyyyMMdd");

    /**
     * 根据指定字段 将 list 分组
     *
     * @param list
     * @param separator 字段使用分隔符连接 组成key
     * @param fields
     * @return
     */
    public ArrayListMultimap<String, T> groupMultiList(List<T> list, String separator, Field... fields) {
        ArrayListMultimap<String, T> multimap = ArrayListMultimap.create();

        String key;
        //Object field;
        try {
            for (T t : list) {

                key = "";
                for (Field f : fields) {
                    f.setAccessible(true);
                    //日期类型格式化为 YYYY-MM-DD
                    if (f.getType().equals(Date.class))
                        key += (separator + fmtyyyyMMdd.print(((Date) f.get(t)).getTime()));
                    else
                        key += (separator + f.get(t).toString());
                }
                key = key.substring(1);

                multimap.put(key, t);
            }
        } catch (Exception e) {
            logger.error("", e);
        }

        return multimap;
    }

    /**
     * 根据指定字段 将 list 分组
     *
     * @param list
     * @param separator 字段使用分隔符连接 组成key
     * @param fields
     * @return
     */
    public Map<String, T> groupList(List<T> list, String separator, Field... fields) {
        Map<String, T> map = new HashMap<>();

        String key;
        //Object field;
        try {
            for (T t : list) {

                key = "";
                for (Field f : fields) {
                    f.setAccessible(true);
                    //日期类型格式化为 YYYY-MM-DD
                    if (f.getType().equals(Date.class))
                        key += (separator + fmtyyyyMMdd.print(((Date) f.get(t)).getTime()));
                    else
                        key += (separator + f.get(t).toString());
                }
                key = key.substring(1);

                map.put(key, t);
            }
        } catch (Exception e) {
            logger.error("", e);
        }

        return map;
    }

    /**
     * 计算并集
     *
     * @param all
     * @param sub
     * @return
     */
    public List<String> calcUnion(Collection<String> all, Collection<String> sub) {
        List<String> rs = new ArrayList<>();

        for (String str : all) {
            if (sub.contains(str))
                rs.add(str);
        }
        return rs;
    }

    /**
     * 计算补集
     *
     * @param all
     * @param sub
     * @return
     */
    public List<String> calcComplement(Collection<String> all, Collection<String> sub) {
        List<String> rs = new ArrayList<>();

        for (String str : all) {
            if (!sub.contains(str))
                rs.add(str);
        }
        return rs;
    }
}