首页 > 解决方案 > 返回转换为数组的列表列表,不包括任何空项

问题描述

发现很难返回转换为数组的列表列表,不包括任何空项。项目应该按照它们在列表中出现的顺序出现。我的测试通过直到行:
assertEquals("[-1, -2, -1, 4, 5, 6, 7, 8, 9, 100, 200, 700, 900, 10, 20, 90, 20, 22] ", Arrays.toString(结果)); 我想知道问题是什么。

public static int[] nonNullItemsToArray(ArrayList<ArrayList<Integer>> list) {
    if (list == null) {
        return null;
    }
    int arrayLength = 0;
    for (int i = 0; i < list.size(); i++) {
        if (list.get(i) != null) {
            arrayLength += list.get(i).size();
        }
    }
    int j = 0;
    int[] alist = new int[arrayLength];
    for (int i = 0; i < list.size(); i++) {
        if (list.get(i) != null) {
            for (int k = 0; k < list.get(i).size(); k++) {
                if (list.get(i).get(k) != null) {
                    alist[j++] = list.get(i).get(k);
                }
            }
        }
    }

    return alist;
}

@Test @Graded(description="NonNullItemsToArrayComprehensive")
    public void testNonNullItemsToArrayComprehensive() {
        testNonNullItemsToArrayBasic();
        int[] result = ListOfListService.nonNullItemsToArray(null);
        assertEquals(null, result);

        result = ListOfListService.nonNullItemsToArray(list4_nullItems);
        assertEquals("[-1, -2, -1, 4, 5, 6, 7, 8, 9, 100, 200, 700, 900, 10, 20, 90, 20, 22]", Arrays.toString(result));
        currentMethodName = new Throwable().getStackTrace()[0].getMethodName();
    }

标签: javaarraylistsub-array

解决方案


正如 saka 在他/她的回答中已经提到的那样,您的代码会0在结果数组中产生不需要的条目,特别是输入中嵌套列表中的0每个条目都有一个条目。null

input  = [[1, 2, null], null, [null, 3, 4]]
           entry 1 ^     entry 2 ^

output = [1, 2, 3, 4, 0, 0]
       in the result  ^  ^

根本原因是您null在计算初始数组大小时没有考虑这些嵌套条目。

int arrayLength = 0;
for (int i = 0; i < list.size(); i++) {
    if (list.get(i) != null) {
        arrayLength += list.get(i).size();
    }
}

在这里,arrayLength += list.get(i).size()您必须确定null嵌套列表中非条目的数量并将此计数添加到arrayLength.

for (int k = 0; k < list.get(i).size(); k++) {
    if (list.get(i).get(k) != null) {
       arrayLength++;
    }
}

推荐阅读