我的任务是解决此代码返回字符串值的问题,但由于迭代添加了null元素,因此需要修剪或删除它们。在调试期间,数组的值主要包含"所有元素都为null",但其他解决方案(如data.removeAll(Collections.singleton(null));
)不起作用,因为它是null的元素,它仍然以原始大小返回。有没有办法在初始循环的迭代之后删除这些元素,或者应该在循环内部为数据分配"值"?
代码:
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;
}
}
}
}
k++;
}
return data;
}
答案 0 :(得分:1)
您可以轻松修剪List
中的空值,但您一直在尝试将数组错误地转换为List
。
由于你有一个二维数组,你需要创建一个嵌套列表(List<List<String>>
)来存储数据。
例如,让我们从一个空的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[][]
,这将被null
数据“修剪”,如下所示:
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]
答案 1 :(得分:0)
您需要做的就是将其设置为空白字符串。检查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;
现在数据没有任何空值,但它可能有空/空字符串。
答案 2 :(得分:0)
根据您的评论,您似乎必须为String[][]
返回getStringsFromSpreadSheet
。它是否正确?如果是这样,没有一种很好的方法来跟踪有多少单元格为空/非空。 2D阵列必须是矩形的。因此,如果您的某个行填充了3列,并且一行仅填充了1列,则该数组必须至少为3列宽。我试图在下面直观地表示这一点。
Row | Column 1 | Column 2 | Column 3 |
1 | something | something | something |
2 | something | null | null |
因此,对于上述数据,您必须声明至少2x3的2D数组以适合您的所有数据。无论如何,如果你的一行没有填充所有3列,那么你将始终拥有该行的空单元格。 Array.length
将始终返回数组的大小,永远不会返回null / not null的数量。
如果您只能返回String[][]
,则您的选项有限。如果您能够返回其他内容,我们可以通过一些选项。