首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ito添加到另一个列表后列表大小为零,然后调用list.clear()

将ito添加到另一个列表后列表大小为零,然后调用list.clear()
EN

Stack Overflow用户
提问于 2021-11-11 22:08:47
回答 1查看 85关注 0票数 0

我有一个脚本尝试从数组创建大小为2000的list (List<Integer>),然后将它们添加到result (List<List<Integer>>)中。它还将剩余的元素添加到结果列表中。代码试图通过调用list.clear重用size 2000的列表。

问题是,在将2000大小的第一个列表添加到结果列表后,该列表似乎会丢失。我期望在第一个if块结束时,显示结果元素0大小将给我2000年,但它会给出0。为什么?其余的结果令人费解,例如在第二个if块的末尾,其中结果内容为2个大小为51的列表。

请帮帮忙。

如果不使用list.clear(),而是使用list = new ArrayList<>();,我就会得到预期的结果。

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

    public static void main(String[] args) {
        // Create chunks
        List<List<Integer>> masterList = getChunks(getArray(2051));
        // Display size
        System.out.println("masterList: " + masterList.size());
    }
    
    // Create array
    public static Integer[] getArray(int size) {
        Integer[] arr = new Integer[size];
        for (int i = 0; i < size; i++) {
            arr[i] = i;
        }
        return arr;
    }
    
    // From input array, create lists of size 2000 
    public static List<List<Integer>> getChunks(Integer[] arr) {

        List<List<Integer>> result = new ArrayList<>();
        List<Integer> list = new ArrayList<>();

        if (arr.length > 2000) {

            for (int i = 0; i < arr.length; i++) {
                // Add to list
                list.add(i);
                
                // If size == 2000, add list to result
                if (i > 0 && i % 1999 == 0) {
                    System.out.println("list if 1: " + list.size());        // 2000
                    result.add(list);
                    list.clear();
                    System.out.println("empty if 1: " + list.isEmpty());    // true
                    System.out.println("result if 1:");
                    display(result);                                        // size-0: 0 <== why???  I expect size-0: 2000
                }
                
                // Add remaining elements to result
                if (i == arr.length-1 && list.size() > 0) {
                    System.out.println("i if 2: " + i);                     // 2050  <-- last element
                    System.out.println("list if 2: " + list.size());        // 51
                    result.add(list);
                    System.out.println("result if 2:");
                    display(result);                                        // size-0: 51, size-1: 51
                    break;                                                  
                }
            } 
        } else {
            System.out.println("arr < 2000");                               // Not called
        }

        System.out.println("end result: " + result.size());                 // 2
        display(result);                                                    // size-0: 51, size-1: 51
        return result;
    }

    public static void display(List<List<Integer>> list) {
        for (int i = 0; i < list.size(); i++) {
            System.out.println("size-" + i + ": " + list.get(i).size());
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-11-12 10:15:41

从程序中删除"list.clear()“,它将返回您的预期结果"2000”

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

https://stackoverflow.com/questions/69935517

复制
相关文章

相似问题

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