按数组列表自定义分页

我想在java代码中创建一个数组列表的自定义分页

import org.springframework.data.domain.Sort; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Sort.Direction; ... int page = 0; int count = 8; String sortOrder = "desc"; String sortBy = "id"; Sort sort = new Sort(Direction.fromString(sortOrder), sortBy); PageRequest pageable = new PageRequest(page, count, sort); List impiantos = myService.findMyMethod(); // returned 30 objects Page pageImpianto = new PageImpl(impiantos, pageable, impiantos.size()); 

上面的脚本不会返回包含8个元素的页面。 为什么?

NB列表没有从db返回

你能帮助我吗?

解决了这个解决方法。

  import org.springframework.data.domain.Sort; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Sort.Direction; ... int page = 0; int count = 8; String sortOrder = "desc"; String sortBy = "id"; Sort sort = new Sort(Direction.fromString(sortOrder), sortBy); PageRequest pageable = new PageRequest(page, count, sort); List impiantos = myService.findMyMethod(); // returned 30 objects int max = (count*(page+1)>impiantos.size())? impiantos.size(): count*(page+1); Page pageImpianto = new PageImpl(impiantos.subList(page*count, max), pageable, impiantos.size()); 

我实现了一个新的自定义比较器类

 import java.lang.reflect.Field; import java.util.Comparator; import java.util.Date; public class MyListComparator implements Comparator { final String sortBy; final String sortOrder; public MyListComparator(String sortBy, String sortOrder) { this.sortBy = sortBy; this.sortOrder = sortOrder; } @Override public int compare(Object o1, Object o2) { try { Field field1 = o1.getClass().getDeclaredField(sortBy); Field field2 = o2.getClass().getDeclaredField(sortBy); field1.setAccessible(true); // because the fields in Impianto entity has "private" field2.setAccessible(true); if(o1.getClass().getDeclaredField(sortBy).getType() == Long.class){ Long d1 = (Long) field1.get(o1); Long d2 = (Long) field2.get(o2); return (sortOrder.toLowerCase().equals("asc"))? d1.compareTo(d2) : d2.compareTo(d1); }else if(o1.getClass().getDeclaredField(sortBy).getType() == Date.class){ Date d1 = (Date) field1.get(o1); Date d2 = (Date) field2.get(o2); return (sortOrder.toLowerCase().equals("asc"))? d1.compareTo(d2) : d2.compareTo(d1); }else{ String d1 = (String) field1.get(o1); String d2 = (String) field2.get(o2); return (sortOrder.toLowerCase().equals("asc"))? d1.compareTo(d2) : d2.compareTo(d1); } } catch (SecurityException e) { throw new RuntimeException(e); } catch (NoSuchFieldException e) { throw new RuntimeException("Missing variable sortBy"); }catch (ClassCastException e) { throw new RuntimeException("sortBy is not found in class list"); } catch (IllegalArgumentException e) { //shoud not happen throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } } 

我根据您自己的代码制作了自己的代码,以满足客户的要求,没有任何排序等等。谢谢

这就是Controller的样子

  @RequestMapping(value="/zonas", method = RequestMethod.GET) public String zonas(ModelMap modelMap, @PageableDefault(size=3) Pageable pageable, ZonasFilter zonasFilter, Locale locale) { LOGGER.info("Cargando la vista del índice de Zonas."); List zonas; try { zonas = zonasService.loadAll(); int max = (pageable.getPageSize()*(pageable.getPageNumber()+1)>zonas.size())? zonas.size(): pageable.getPageSize()*(pageable.getPageNumber()+1); modelMap.addAttribute("zonas",new PageImpl(zonas.subList(pageable.getPageSize()*pageable.getPageNumber(), max), pageable, zonas.size())); } catch (ApiException e) { // TODO Auto-generated catch block e.printStackTrace(); List errors=e.getErrors(); for (ApiError apiError : errors) { modelMap.addAttribute("error", messages.getMessage(apiError.getMessage(), null, locale)); } } LOGGER.info("Vista del índice de Zonascargada."); return "zonas/index"; } 

Flavio Troia’answer是错误的,当impiantos小于count并且页面大于1时,调用subList函数会出现exception,fromIndex(10)> toIndex(5),我自己创建了这样的代码,它可能是冗余,但对我来说,它很容易理解和正确〜

  List shopCourseBizPojos = addCourseCoupons(mcCouponLists, shopCourseLists); if (pageable.getOffset() > shopCourseBizPojos.size()) { long total = 0L; PageImpl emptyPage = new PageImpl<>(Lists.newArrayList(), pageable, total); resultDo.setResult(emptyPage); return resultDo; } if (pageable.getOffset() <= shopCourseBizPojos.size() && pageable.getOffset() + pageable.getPageSize() > shopCourseBizPojos.size()) { List bizPojos = shopCourseBizPojos.subList(pageable.getOffset(), shopCourseBizPojos.size()); PageImpl pPage = new PageImpl<>(bizPojos, pageable, shopCourseLists.size()); resultDo.setResult(pPage); return resultDo; } List ucShopCourseBizPojos = shopCourseBizPojos.subList(pageable.getOffset(), pageable.getOffset() + pageable.getPageSize()); PageImpl pPage = new PageImpl<>(ucShopCourseBizPojos, pageable, shopCourseLists.size()); resultDo.setResult(pPage); return resultDo;