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