程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java中List對象排序通用辦法

java中List對象排序通用辦法

編輯:關於JAVA

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法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved