Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从字符串数组中删除空元素,其中";“所有元素均为空”;_Java_Arrays - Fatal编程技术网

Java 从字符串数组中删除空元素,其中";“所有元素均为空”;

Java 从字符串数组中删除空元素,其中";“所有元素均为空”;,java,arrays,Java,Arrays,我的任务是修复一个问题,该代码返回字符串值,但由于迭代添加了null元素,因此需要修剪或删除这些元素。在调试期间,数组的值主要包含“所有元素均为null”,但其他解决方案,如data.removeAll(Collections.singleton(null))不起作用,因为它是空的元素,并且仍然返回原始大小。是否有一种方法可以在初始循环迭代后删除这些元素,还是应该在为数据分配“值”的循环内执行 代码: private String[]getStringsFromSpreadSheet(工作表ws

我的任务是修复一个问题,该代码返回字符串值,但由于迭代添加了null元素,因此需要修剪或删除这些元素。在调试期间,数组的值主要包含“所有元素均为null”,但其他解决方案,如
data.removeAll(Collections.singleton(null))不起作用,因为它是空的元素,并且仍然返回原始大小。是否有一种方法可以在初始循环迭代后删除这些元素,还是应该在为数据分配“值”的循环内执行

代码:

private String[]getStringsFromSpreadSheet(工作表ws){
int rowNum=ws.getLastRowNum()+1;
int colNum=ws.getRow(0.getLastCellNum();
字符串[][]数据=新字符串[(rowNum-1)][colNum];
int k=0;
for(int i=1;i
只需将其设置为空字符串即可。检查else子句

private String[][] getStringsFromSpreadSheet(Sheet ws) {
int rowNum = ws.getLastRowNum() + 1;
int colNum = ws.getRow(0).getLastCellNum();
String[][] data = new String[(rowNum - 1)][colNum];

int k = 0;
for (int i = 1; i < rowNum; i++) {
    ws.getRow(i);
    if (ws.getRow(i) != null) {
        for (int j = 0; j < colNum; j++) {
            if (ws.getRow(i).getCell(j) != null) {
                String value = ws.getRow(i).getCell(j).toString();
                if (!value.toString().isEmpty()) {
                    data[k][j] = value;
                }
            } else {
                data[k][j] = "";
            }
        }
    }
    k++;
}
return data;
private String[]getStringsFromSpreadSheet(工作表ws){
int rowNum=ws.getLastRowNum()+1;
int colNum=ws.getRow(0.getLastCellNum();
字符串[][]数据=新字符串[(rowNum-1)][colNum];
int k=0;
for(int i=1;i

现在,数据不会有任何空值,但可能有空字符串。

根据您的注释,您似乎必须返回一个
字符串[][]
对于
getStringsFromSpreadSheet
。这是否正确?如果是这样,就没有一个好方法来跟踪有多少单元格为空/非空。2D数组必须是矩形的。因此,如果其中一行填充了3列,而一行只填充了1列,那么数组必须至少有3列宽。我已经尝试表示这个v我在下面

Row | Column 1  | Column 2  | Column 3  |
 1  | something | something | something |
 2  | something |    null   |    null   |
因此,对于上述数据,您必须声明一个至少2x3的2D数组以适合所有数据。不管怎样,如果其中一行没有填充所有3列,则该行的单元格将始终为空。
array.length
将始终返回数组的大小,而不会返回有多少行为空/不为空的计数


如果您只能返回
字符串[]【】【】
,则您的选项会受到限制。如果您能够返回其他内容,我们可以使用一些选项。

您可以轻松地从
列表中删除空值,但您一直试图错误地将数组转换为
列表

因为您有一个二维数组,所以需要创建一个嵌套列表(
list
)来存储数据

例如,让我们从一个大部分为空的
字符串[][]
开始:

    String[][] data = new String[3][3];
    data[0][0] = "foo";
    data[1][1] = "bar";

    //data is a 3x3 array
    for (int i=0; i<data.length; i++) {
        System.out.println(Arrays.toString(data[i]));
    }
    //[foo, null, null]
    //[null, bar, null]
    //[null, null, null]

数组的大小表示已分配的空间大小,与数组中的值是否为null无关。如果需要动态大小的数据结构,请改用列表。不能从数组中删除元素,只能分配不同的值。如果数组中不需要null元素,则必须分配元素的值为非null。@azurefrog正确,但是转换为List然后尝试删除null的操作失败,因为大小保持不变,我受到其他要求的限制,只能返回字符串[],但大小为“修剪”的字符串。
Collection.addAll(dataList,data)
没有做你认为应该做的事情。你在这里做的是创建一个字符串数组列表。当你试图从列表中删除null时,什么都不会出现,因为它充满了数组引用,其中没有一个是null,即使数组本身有null值。这太长了,无法在注释中解释,所以我添加了一个答案h一些示例代码,演示如何将2d数组转换为嵌套的
列表
并返回,包括在其
列表
形式时从中修剪空值。请告诉我这是否有帮助……什么?2d数组不必是矩形的。
字符串[]数组=新字符串[2][;数组[0]=新字符串[3];数组[1]=新字符串[1];
完全可以工作并创建一个非矩形数组。我不知道你可以这样做。感谢@LouisWasserman的输入。如果“某物”如果在第2列中,我们仍然需要创建一个1x2
Array
,1个单元格仍然需要为空。使用
String[][]
来计算有多少单元格为空/不为空仍然不是一个干净的方法,感谢您帮助我理解这一点。
    String[][] data = new String[3][3];
    data[0][0] = "foo";
    data[1][1] = "bar";

    //data is a 3x3 array
    for (int i=0; i<data.length; i++) {
        System.out.println(Arrays.toString(data[i]));
    }
    //[foo, null, null]
    //[null, bar, null]
    //[null, null, null]
    List<List<String>> dataList = new ArrayList<>();
    for (int i=0; i<data.length; i++) {
        List<String> temp = new ArrayList<>();
        Collections.addAll(temp, data[i]);
        temp.removeAll(Collections.singleton(null));
        if (!temp.isEmpty()) {
            dataList.add(temp);
        }
    }
    String[][] newData = new String[dataList.size()][];
    for (int i=0; i<dataList.size(); i++) {
        List<String> subList = dataList.get(i);
        newData[i] = subList.toArray(new String[subList.size()]);
    }

    //newData is a 2x1 array
    for (int i=0; i<newData.length; i++) {
        System.out.println(Arrays.toString(newData[i]));
    }
    //[foo]
    //[bar]