一.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,如有不妥之处,请批评指正。