首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java分页列表

Java分页列表
EN

Stack Overflow用户
提问于 2016-04-05 19:15:57
回答 3查看 5.4K关注 0票数 0

我有3个不同种类的ObjectsList。例如:

List A包含64元素。

List B包含33元素。

List C包含515元素。

所以总的来说,我有612元素。

例如,我想创建100元素的组(Pagination),它看起来像这样:

1页:List A64元素/ List B33元素/ List C:<代码>D23元素

2页:List A0元素/ List B0元素/ List C:<代码>d33元素

3页:List A0元素/ List B0元素/ List C:<代码>D43元素

4页:List A0元素/ List B0元素/ List C:<代码>D53元素

5页:List A0元素/ List B0元素/ List C:<代码>D63元素

6页:List A0元素/ List B0元素/ List C:<代码>D73元素

7页:List A0元素/ List B0元素/ List C:<代码>D83元素

我的想法是创建一个Map<Integer, List<List>,其中keyPagevalue是一个包含3个代码的List (每个Lists对应一个List AB或<Lists>D93List>)。

下面是我的代码:

代码语言:javascript
复制
            int totalPages = 0;
            int totalElements = listA.size() + listB.size() + listC.size();
            if(totalElements % PAGE_SIZE == 0) {
                totalPages = totalElements / PAGE_SIZE;
            }else {
                totalPages = (totalElements / PAGE_SIZE) + 1;
            }


            Map<Integer, List<List<ParentObject>>> paginatedMap = new HashMap<Integer, List<List<ParentObject>>>();
            for(int i=0; i<totalPages; i++) {
                List<List<ParentObject>> list = new LinkedList<List<ParentObject>>();
                List<ObjectA> subListA = new LinkedList<ObjectA>();
                List<ObjectB> subListB = new LinkedList<ObjectB>();
                List<ObjectC> subListC = new LinkedList<ObjectC>();
                int total = 0;

                if(total <= PAGE_SIZE) {
                    subListA.addAll(listA.subList(0, (PAGE_SIZE-total)-1));
                    listA.removeAll(listA.subList(0, (PAGE_SIZE-total)-1));
                    total = total + subListA.size();
                }

                if(total <= PAGE_SIZE) {
                    subListB.addAll(listB.subList(0, (PAGE_SIZE-total)-1));
                    listB.removeAll(listB.subList(0, (PAGE_SIZE-total)-1));
                    total = total + subListB.size();
                }

                if(total <= PAGE_SIZE) {
                    subListC.addAll(listC.subList(0, (PAGE_SIZE-total)-1));
                    listC.removeAll(listC.subList(0, (PAGE_SIZE-total)-1));
                    total = total + subListC.size();
                }

                list.add(subListA);
                list.add(subListB);
                list.add(subListC);
                paginatedMap.put(i, list);
            }

其中PAGE_SIZE为100

这不起作用,因为在调用subList method之前,我当然需要检查每个list包含多少个元素。

我想我走错了路,但我看不到另一种方法。

有什么想法吗?

谢谢!

最后我让它起作用了。代码如下:

代码语言:javascript
复制
private Map<Integer, List<List<MyObject>>> paginateDataRequest(List<List<MyObject>> requestLists, double pageSize) {
    Map<Integer, List<List<MyObject>>> result = new LinkedHashMap<Integer, List<List<MyObject>>>();
    int totalElements = 0;

    //We calculate the total of the elements contained in the requestLists.
    for(List<MyObject> subList : requestLists) {
        if(subList != null) {
            totalElements += subList.size();
        }
    }

    //We round it up. The result Map will contain x pages with {pageSize} elements each one. For example, if the total amount of request is 101,
    //our Map will have 2 pages (100 elements + 1 element)
    int totalRequests = (int)Math.ceil(totalElements / pageSize);

    //We iterate over each page
    for(int i=0; i<totalRequests; i++) {
        List<List<MyObject>> entry = new LinkedList<List<MyObject>>();

        int freeElements = (int)pageSize;

        for(List<MyObject> list : requestLists) {
            List<MyObject> subList = new LinkedList<MyObject>();
            if(freeElements > 0) {
                if(list.size() > freeElements) {
                    subList.addAll(list.subList(0, freeElements));
                }else {
                    subList.addAll(list);
                }
                //We update the left free elements
                freeElements -= subList.size();
            }
            entry.add(subList);
            list.removeAll(subList);

        }
        //We add a new page to the result Map
        result.put(i, entry);
    }

    return result;
}

感谢大家的帮助!

EN

回答 3

Stack Overflow用户

发布于 2016-04-05 20:46:29

这不起作用,因为在调用subList方法之前,我需要检查每个list包含多少个元素。

如果你不愿意检查列表的大小,这似乎才是问题所在。通过首先检查大小,使subList最多与整个列表一样大。

同样,不是

代码语言:javascript
复制
listB.removeAll(listB.subList(0, (PAGE_SIZE-total)-1));

你应该使用

代码语言:javascript
复制
listB.subList(0, (PAGE_SIZE-total)-1).clear();

以防止相等的元素被意外删除。

下面的方法提供了一种更可重用的方法来完成任务,因为它不依赖于特定数量的列表,也不修改源列表:

将输入数据结构从3个单独的List转换为包含这些列表的列表。这允许您跟踪要从中获取元素的列表的索引,以及该列表中尚未使用的元素的第一个索引。这样,您就可以简单地浏览列表并添加项目,直到页面变满。

下面的代码返回一个List而不是Map,因为键是数字0,...,n,但是可以很容易地修改它以返回一个映射:

代码语言:javascript
复制
public static <T> List<List<List<T>>> paginate(List<? extends List<? extends T>> objects, final int pageSize) {
    List<List<List<T>>> result = new ArrayList<>();

    int index = 0;
    int size = objects.size();

    // skip empty lists
    while (index < size && objects.get(index).isEmpty()) {
        index++;
    }

    for (int pageIndex = 0; index < size;) {
        int remaining = pageSize;
        List<List<T>> page = new ArrayList<>(size);
        result.add(page);
        for (int i = 0; i < index; i++) {
            page.add(Collections.emptyList());
        }
        while (remaining > 0 && index < size) {
            List<? extends T> source = objects.get(index);
            int lastIndex = Math.min(source.size(), pageIndex + remaining);
            List<T> list = new ArrayList<>(source.subList(pageIndex, lastIndex));
            page.add(list);
            remaining -= lastIndex - pageIndex;
            if (lastIndex == source.size()) {
                index++;
                pageIndex = 0;
                // skip empty lists
                while (index < size && objects.get(index).isEmpty()) {
                    page.add(Collections.emptyList());
                    index++;
                }
            } else {
                pageIndex = lastIndex;
            }
        }
        for (int i = page.size(); i < size; i++) {
            page.add(Collections.emptyList());
        }
    }

    return result;
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-05 21:00:36

一个简单的解决方案,每次创建一个全局列表(优点是它总是使用底层列表的最新版本)。

代码语言:javascript
复制
public class ListPager {

    public List<List<Object>> lists = new ArrayList<List<Object>>();

    public int _pageSize = 100;

    public void addList(List<Object> list) {
        lists.add(list);
    }

    public List<Object> getPage(int p) {
        List<Object> global = new ArrayList<Object>();
        for (List<Object> l : lists) {
            global.addAll(l);
        }
        if (p*_pageSize > global.size()) return global;
        int maxBound = (p + 1)*_pageSize;
        if (maxBound > global.size()) {
            maxBound = p*_pageSize + (global.size()%(p*_pageSize));
        }
        return global.subList(p*_pageSize, maxBound);
    }
}

关联测试类:

代码语言:javascript
复制
public class ListPagerTest {

    public static class ObjectA {
        public String toString() { return "A"; }
    }
    public static class ObjectB {
        public String toString() { return "B"; }
    }
    public static class ObjectC {
        public String toString() { return "C"; }
    }

    @Test
    public void test() {
        List<Object> listA = new ArrayList<Object>();
        for (int i = 0 ; i < 64 ; i++) { listA.add(new ObjectA()); }
        List<Object> listB = new ArrayList<Object>();
        for (int i = 0 ; i < 33 ; i++) { listB.add(new ObjectB()); }
        List<Object> listC = new ArrayList<Object>();
        for (int i = 0 ; i < 515 ; i++) { listC.add(new ObjectC()); }

        ListPager lp = new ListPager();
        lp.addList(listA);
        lp.addList(listB);
        lp.addList(listC);

        for (int i = 0 ; i < 7 ; i++) {
            System.out.println("Page " + i);
            print(lp.getPage(i));
        }
    }

    public static void print(List<Object> l) {
        StringBuffer out = new StringBuffer();
        for (Object o : l) out.append(o + ",");
        System.out.println(out.toString());
    }

}
票数 1
EN

Stack Overflow用户

发布于 2016-04-05 20:02:25

您可以将所有不同的对象放在一个列表中,然后使用instanceof来检测类类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36424856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档