/**
* 解决因为链表过长,sql查询慢的问题
* 使用分治算法,先切分链表,然后查询结果,最后合并结果
*
* @author lingpy
* @since 1.0
*/
public class DivideAndConquerUtil {
/**
*
* @param dataList 元数据
* @param exceuter 执行类
* @return
* @throws Exception
*/
public static <R extends Map, E> R query(List<E> dataList,Executer<R,E> exceuter)throws Exception{
return query(dataList,exceuter,100);
}
/**
*
* @param dataList
* @param exceuter
* @param subArrayLength 切分的粒度
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static <R extends Map, E> R query(List<E> dataList,Executer<R,E> exceuter,int subArrayLength)throws Exception{
if(dataList == null || dataList.size() <= subArrayLength){
return exceuter.execute(dataList);
}
R result = null;
int start = 0, end = start;
while(start < dataList.size()){
end = start + subArrayLength;
if(end > dataList.size()){
end = dataList.size();
}
R r = exceuter.execute(dataList.subList(start, end));
if(result == null){
result = r;
}else{
result.putAll(r);
}
start = end;
}
return result;
}
public interface Executer<R,E>{
R execute(List<E> dataList) throws Exception;
}
}