通用分组

    一.Grouper

 

import java.util.List;

/**
 * User: Zhong Gang
 */
public interface Grouper<K, E> {

    GroupResults group();

    K key(E element);
}

 

    二.AbstractGrouper

 

 

import java.util.ArrayList;
import java.util.List;

/**
 * User: Zhong Gang
 */
public abstract class AbstractGrouper<K, E> implements Grouper<K, E> {
    private List<E> elements = new ArrayList<E>();

    public AbstractGrouper(List<E> elements) {
        this.elements = elements;
    }

    @Override
    public GroupResults group() {
        GroupResults results = new GroupResults();

        for (E element : elements) {
            K key = key(element);
            GroupResult groupResult = results.getGroupResult(key);
            if (groupResult == null) {
                GroupResult groupedResult = new GroupResult(key);
                groupedResult.add(element);
                results.add(groupedResult);
            } else {
                groupResult.add(element);
            }
        }

        return results;
    }


    public abstract K key(E element);
}

 

    三.GroupResults

 

 

import java.util.ArrayList;
import java.util.List;

/**
 * User: Zhong Gang
 */
public class GroupResults<K> {
    private List<GroupResult> groupResults = new ArrayList<GroupResult>();

    public List<GroupResult> getGroupResults() {
        return groupResults;
    }

    public boolean isEmpty() {
        return groupResults.isEmpty();
    }

    public void add(GroupResult groupedResult) {
        groupResults.add(groupedResult);
    }

    public GroupResult getGroupResult(K key) {
        for (GroupResult groupResult : groupResults) {
            if (key.equals(groupResult.getKey())) {
                return groupResult;
            }
        }
        return null;
    }
}

 

    四.GroupResult

 

 

import java.util.ArrayList;
import java.util.List;

/**
 * User: Zhong Gang
 */
public class GroupResult<K, E> {
    private K key;
    private List<E> results = new ArrayList<E>();

    public GroupResult(K key) {
        this.key = key;
    }

    public K getKey() {
        return key;
    }

    public List<E> getResults() {
        return results;
    }

    public void add(E element) {
        results.add(element);
    }
}

 

     运用以上代码可对除Java中的基本类型除外的任意类型进行关键字分组,核心代码为AbstractGrouper中的group方法,该方法实现了针对设置的关键字进行分组的逻辑,分组结果为GroupResult,针对每一个不同的关键字有不同的List,最终结果就是GroupResults,里面包含了分组后的List,每一个元素就是GroupResult,如有不妥之处,请批评指正。

你可能感兴趣的:(java,group,Grouper)