2012-08-31 63 views
10

我有對象列表。我需要做分頁。
輸入參數是每個頁面和頁碼的最大數量對象。java分頁util

例如輸入list = ("a", "b", "c", "d", "e", "f")
每頁的最大數目是2 頁號2 結果=( 「C」, 「d」)

是否有任何現成的類(LIBS)做這個?例如Apache項目等。

+0

它是一個有序列表? –

回答

19
int sizePerPage=2; 
int page=2; 

int from = Math.max(0,page*sizePerPage); 
int to = Math.min(list.size(),(page+1)*sizePerPage) 

list.subList(from,to) 
+2

使用'(page + 1)* sizePerPage'而不是'page * sizePerPage + sizePerPage'更清潔。 – hsz

+0

是的,你說得對。 –

+1

兩個通知:1)IndexOutOfBoundsException不捕捉2)這是基於0的頁面,而不是1如問題 –

3

嘗試:

int page = 1; // starts with 0, so we on the 2nd page 
int perPage = 2; 

String[] list = new String[] {"a", "b", "c", "d", "e", "f"}; 
String[] subList = null; 

int size = list.length; 
int from = page * perPage; 
int to = (page + 1) * perPage; 
    to = to < size ? to : size; 

if (from < size) { 
    subList = Arrays.copyOfRange(list, from, to); 
} 
+0

這可能會產生ArrayIndexOutOfBoundsException –

+0

@ChristianKuetbach我編輯了我的答案。 – hsz

0

根據您的問題簡單List.subList會給你預期的行爲 大小()/ 2 =頁數

0

你可以使用Math.min守衛使用List.subList反對ArrayIndexOutOfBoundsException

List<String> list = Arrays.asList("a", "b", "c", "d", "e"); 
int pageSize = 2; 
for (int i=0; i < list.size(); i += pageSize) { 
    System.out.println(list.subList(i, Math.min(list.size(), i + pageSize))); 
} 
1

試試這個:

int pagesize = 2; 
int currentpage = 2; 
list.subList(pagesize*(currentpage-1), pagesize*currentpage); 

此代碼返回一個列表,只有你想(頁)的元素。

您應該檢查索引以避免java.lang.IndexOutOfBoundsException。

16

與Java 8蒸:

list.stream() 
    .skip(page * size) 
    .limit(size) 
    .collect(Collectors.toCollection(ArrayList::new)); 
2

簡單的方法

public static <T> List<T> paginate(Page page, List<T> list) { 
     int fromIndex = (page.getNumPage() - 1) * page.getLenght(); 
     int toIndex = fromIndex + page.getLenght(); 

     if (toIndex > list.size()) { 
     toIndex = list.size(); 
     } 

     if (fromIndex > toIndex) { 
     fromIndex = toIndex; 
     } 

     return list.subList(fromIndex, toIndex); 
    }