實體類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 + "毫秒!");