作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的任务是解决此代码返回字符串值的问题,但由于迭代添加了 null 元素,因此需要修剪或删除这些元素。在调试期间,数组的值主要包含“所有元素均为空”,但其他解决方案如 data.removeAll(Collections.singleton(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;
}
最佳答案
您可以轻松地从 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]
关于java - 从字符串数组中删除空元素,其中 "All elements are null",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32636133/
我是一名优秀的程序员,十分优秀!