2012-08-31 10 views
10

Mam listę obiektów. Potrzebuję stronicowania.
Parametry wejściowe to maksymalna liczba obiektów na stronę i numer strony.java stronicowanie util

Na przykład wejście list = ("a", "b", "c", "d", "e", "f")
Maksymalna liczba na stronie jest 2 Numer strony jest 2 Wynik = ("c", "d")

Czy są jakieś gotowe klas (libs) zrobić to? Na przykład projekt Apache lub podobne.

+0

Czy to uporządkowana lista? –

Odpowiedz

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

Łatwiej używać '(page + 1) * sizePerPage' zamiast' page * sizePerPage + sizePerPage'. – hsz

+0

Tak, masz rację. –

+1

Dwie uwagi: 1) Wyjątek IndexOutOfBoundsException nie został przechwycony 2) Jest to strona bazująca na 0, a nie 1, jak pytano w pytaniu –

3

spróbuj:

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

To może wytworzyć ArrayIndexOutOfBoundsException –

+0

@ ChristianKuetbach Edytowałem swoją odpowiedź. – hsz

0

Jak na swoje pytanie prosty List.subList da Ci oczekiwane zachowanie size()/2 = liczba stron

0

można użyć List.subList użyciu Math.min pilnować przeciw 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

Spróbuj tego:

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

Ten kod zwraca listę tylko z elementów, które chcesz (strona).

Należy również sprawdzić indeks, aby uniknąć wyjątku java.lang.IndexOutOfBoundsException.

16

Z Java 8 par:

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

Prosta metoda

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); 
    } 
Powiązane problemy