java中List對象排序通用辦法。本站提示廣大學習愛好者:(java中List對象排序通用辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是java中List對象排序通用辦法正文
本文實例講述了java中List對象排序通用辦法。分享給年夜家供年夜家參考。詳細剖析以下:
在數據庫中查出來的列表list中,常常須要對分歧的字段從新排序,普通的做法都是應用排序的字段,從新到數據庫中查詢。假如不到數據庫查詢,直接在第一次查出來的list中排序,無疑會進步體系的機能。
只需把第一次查出來的成果寄存在session中,便可以對list從新排序了。普通對list排序可使用Collections.sort(list),但假如list中包括是一個對象的話,這類辦法照樣行欠亨的。那要怎樣排序呢?假如有一個UserInfo對象,包括以下字段:
private java.lang.Integer userId; private java.lang.String username; private java.util.Date birthDate; private java.lang.Integer age;
那末如今要對userId排序,你能夠會應用上面的辦法:
Collections.sort(list, new Comparator() { public int compare(Object a, Object b) { int one = ((Order)a).getUserId (); int two = ((Order)b).getUserId (); return one- two ; } });
如許,假如要完成對UserInfo列表各字段排序,是否是每一個字段都寫一段如上所示的代碼呢?那固然不是我們所須要的成果。寫法式要寫得愈來愈精練,不克不及越寫越冗余。能不克不及寫一個通用的辦法呢?謎底是確定的,但起首必需能處理上面三個成績:
1.可使用泛型;
2.可以或許應用通用的比擬辦法,好比compareTo;
3.有無相似泛型、泛型辦法那樣的泛辦法?
第1個成績可以處理,第2個成績難度也不是很年夜,由於Java一切的類型都繼續於Object,都有一個ToString的辦法,暫且可以把一切類型轉換成String,然後用compareTo作比擬。第3個成績,日前還沒有我們須要的泛辦法。不外我們能否變通一下,應用getMethod和invoke辦法靜態的掏出辦法出來。完成代碼以下:
public class SortList<E>{ public void Sort(List<E> list, final String method, final String sort){ Collections.sort(list, new Comparator() { public int compare(Object a, Object b) { int ret = 0; try{ Method m1 = ((E)a).getClass().getMethod(method, null); Method m2 = ((E)b).getClass().getMethod(method, null); if(sort != null && "desc".equals(sort))//倒序 ret = m2.invoke(((E)b), null).toString().compareTo(m1.invoke(((E)a), null).toString()); else//正序 ret = m1.invoke(((E)a), null).toString().compareTo(m2.invoke(((E)b), null).toString()); }catch(NoSuchMethodException ne){ System.out.println(ne); }catch(IllegalAccessException ie){ System.out.println(ie); }catch(InvocationTargetException it){ System.out.println(it); } return ret; } }); } }
看看下面的代碼,我們是否是勝利地處理了下面三個成績,而且還加進了正倒序。代碼中沒有效到詳細的對象和類型,曾經具有通用性了,我們用了一個泛型E,假如要對UserInfo的userId排序的話,可以把辦法名用字符串的情勢用參數傳出來:例如“getUserId”。可使用上面供給的代碼測試一下:
//Test.java package test; import java.util.ArrayList; import java.util.List; import java.text.SimpleDateFormat; public class Test { public static void main(String[] args)throws Exception{ List<UserInfo> list = new ArrayList<UserInfo>(); SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd"); list.add(new UserInfo(3,"b",formater.parse("1980-12-01"),11)); list.add(new UserInfo(1,"c",formater.parse("1980-10-01"),30)); list.add(new UserInfo(2,"a",formater.parse("1973-10-01"),11)); System.out.println("-------本來序列-------------------"); for(UserInfo user : list){ System.out.println(user.toString()); } //挪用排序通用類 SortList<UserInfo> sortList = new SortList<UserInfo>(); //按userId排序 sortList.Sort(list, "getUserId", "desc"); System.out.println("--------按userId倒序------------------"); for(UserInfo user : list){ System.out.println(user.toString()); } //按username排序 sortList.Sort(list, "getUsername", null); System.out.println("---------按username排序-----------------"); for(UserInfo user : list){ System.out.println(user.toString()); } //按birthDate排序 sortList.Sort(list, "getBirthDatestr", null); System.out.println("---------按birthDate排序-----------------"); for(UserInfo user : list){ System.out.println(user.toString()); } } }
測試成果以下:
-------本來序列------------------- 3; b; 1980-12-01; 11 1; c; 1980-10-01; 30 2; a; 1973-10-01; 11 --------按userId倒序------------------ 3; b; 1980-12-01; 11 2; a; 1973-10-01; 11 1; c; 1980-10-01; 30 ---------按username排序----------------- 2; a; 1973-10-01; 11 3; b; 1980-12-01; 11 1; c; 1980-10-01; 30 ---------按birthDate排序----------------- 2; a; 1973-10-01; 11 1; c; 1980-10-01; 30 3; b; 1980-12-01; 11
留意:日期的排序是先經由過程格局轉換再來排序的,不然將不克不及有准確的成果。
願望本文所述對年夜家的java法式設計有所贊助。