实体类data
[java] view
plain copy
public class data {
private long id ;
private long courseid ;
private string content ;
public long getid() {
return id;
}
public data setid(long id) {
this.id = id;
return this ;
public long getcourseid() {
return courseid;
public data setcourseid(long courseid) {
this.courseid = courseid;
public string getcontent() {
return content;
public data setcontent(string content) {
this.content = content;
}
排序类
<pre name="code" class="java">import java.lang.reflect.method;
import java.util.arraylist;
import java.util.collection;
import java.util.hashmap;
import java.util.iterator;
import java.util.list;
import java.util.map;
import com.framework.util.paramutils;
public class commonutils {
/**
* 分組依據接口,用于集合分組時,獲取分組依據
*
* @author zhanglikun
* @title groupby
* @date 2013-4-23
*/
public interface groupby<t> {
t groupby(object obj);
* @param colls
* @param gb
* @return
public static final <t extends comparable<t>, d> map<t, list<d>> group(collection<d> colls, groupby<t> gb) {
if (colls == null || colls.isempty()) {
system.out.println("分組集合不能為空!");
return null;
}
if (gb == null) {
system.out.println("分組依據接口不能為null!");
iterator<d> iter = colls.iterator();
map<t, list<d>> map = new hashmap<t, list<d>>();
while (iter.hasnext()) {
d d = iter.next();
t t = gb.groupby(d);
if (map.containskey(t)) {
map.get(t).add(d);
} else {
list<d> list = new arraylist<d>();
list.add(d);
map.put(t, list);
}
return map;
* 将list<v>按照v的methodname方法返回值(返回值必须为k类型)分组,合入到map<k, list<v>>中<br>
* 要保证入参的method必须为v的某一个有返回值的方法,并且该返回值必须为k类型
* @param list
* 待分组的列表
* @param map
* 存放分组后的map
* @param clazz
* 泛型v的类型
* @param methodname
* 方法名
public static <k, v> void listgroup2map(list<v> list, map<k, list<v>> map, class<v> clazz, string methodname) {
// 入参非法行校验
if (null == list || null == map || null == clazz || !paramutils.chkstring(methodname)) {
system.out.print("commonutils.listgroup2map 入参错误,list:" + list + " ;map:" + map + " ;clazz:" + clazz + " ;methodname:" + methodname);
return;
// 获取方法
method method = getmethodbyname(clazz, methodname);
// 非空判断
if (null == method) {
// 正式分组
listgroup2map(list, map, method);
* 根据类和方法名,获取方法对象
public static method getmethodbyname(class<?> clazz, string methodname) {
method method = null;
// 入参不能为空
if (null == clazz || !paramutils.chkstring(methodname)) {
system.out.print("commonutils.getmethodbyname 入参错误,clazz:" + clazz + " ;methodname:" + methodname);
return method;
try {
method = clazz.getdeclaredmethod(methodname);
} catch (exception e) {
system.out.print("类获取方法失败!");
return method;
* 将list<v>按照v的某个方法返回值(返回值必须为k类型)分组,合入到map<k, list<v>>中<br>
* @param method
* 方法
@suppresswarnings("unchecked")
public static <k, v> void listgroup2map(list<v> list, map<k, list<v>> map, method method) {
if (null == list || null == map || null == method) {
system.out.print("commonutils.listgroup2map 入参错误,list:" + list + " ;map:" + map + " ;method:" + method);
// 开始分组
object key;
list<v> listtmp;
for (v val : list) {
key = method.invoke(val);
listtmp = map.get(key);
if (null == listtmp) {
listtmp = new arraylist<v>();
map.put((k) key, listtmp);
}
listtmp.add(val);
system.out.print("分组失败!");
测试类
import java.util.linkedhashmap;
import com.framework.common.commonutils.groupby;
public class test {
* @param args
public static void main(string[] args) {
// 准备一个集合
final int loop = 1000 * 1000;
list<data> list = new arraylist<data>(); // size=8 * loop
for (int i = 0; i < loop; i++) {
list.add(new data().setid(1l).setcourseid(200010l).setcontent("aaa"));
list.add(new data().setid(2l).setcourseid(200010l).setcontent("bbb"));
list.add(new data().setid(3l).setcourseid(200011l).setcontent("ccc"));
list.add(new data().setid(4l).setcourseid(200011l).setcontent("ddd"));
list.add(new data().setid(5l).setcourseid(200010l).setcontent("eee"));
list.add(new data().setid(6l).setcourseid(200011l).setcontent("fff"));
list.add(new data().setid(7l).setcourseid(200010l).setcontent("ggg"));
list.add(new data().setid(8l).setcourseid(200012l).setcontent("hhh"));
// 进行分组 1
long time = system.currenttimemillis();
map<long, list<data>> map2 = new linkedhashmap<long, list<data>>();
commonutils.listgroup2map(list, map2, data.class, "getid");// 输入方法名
long duration = system.currenttimemillis() - time;
system.out.println("分组一执行:" + duration + "毫秒!");
// 分组二
time = system.currenttimemillis();
map<long, list<data>> map = commonutils.group(list, new groupby<long>() {
@override
public long groupby(object obj) {
data d = (data) obj;
return d.getcourseid(); // 分组依据为课程id
});
duration = system.currenttimemillis() - time;
system.out.println("分组二执行:" + duration + "毫秒!");