我有这样的数组列表
[111, 222, 333, 444, 555, 666, , ]
[1, 2, 3, 4, 5, 6, , ]
[11, 12, 13, 14, 15, 16, , ]
[a, s, d, f, g, h, , ]
我想检查它何时找到'h',它将检查第一个单元格的上一行是否等于'11'
到目前为止,我已经完成了
DataFormatter formatter = new DataFormatter();
String val = null;
for (int rowNum = 0; rowNum < sheet.getLastRowNum() + 1; rowNum++) {
Row r = sheet.getRow(rowNum);
ArrayList<String> al = new ArrayList<String>();
for (int i = 0; i <= r.getLastCellNum() + 1; i++) {
Cell cell = r.getCell(i);
val = formatter.formatCellValue(cell);
al.add(val);
}
for (int t = 0; t < al.size(); t++) {
if (al.get(t).equals("h") && al.get(t + 1).equals("") && al.get(t + 2).equals("")) {
if (al.get(rowNum - 1) != null) {
if (al.get(rowNum - 1).contains("11")) {
System.out.println("valid");
continue;
} else {
System.out.println("invalid");
continue;
}
} else {
System.out.println("empty cell not exist ");
continue;
}
}
}
}
输出:invalid
但是 当我更改为:
for (int t = 0; t < al.size(); t++) {
if (al.get(t).equals("16") && al.get(t + 1).equals("") && al.get(t + 2).equals("")) {
if (al.get(rowNum - 1) != null) {
if (al.get(rowNum - 1).contains("1")) {
System.out.println("valid");
continue;
} else {
System.out.println("invalid");
continue;
}
} else {
System.out.println("empty cell not exist ");
continue;
}
}
}
输出:valid
和同样的结果,如果我也将'1'更改为'2',但不是3、4、5、6
有人可以向我解释吗?
更新
如建议的那样,问题出在我的数组列表上。因此,现在,我将其更改为此,但是我被卡住了。在这里更新是否合适,还是我应该问新问题?
ArrayList<ArrayList<String>> mainArrayList = new ArrayList<ArrayList<String>>();
ArrayList<String> al = new ArrayList<String>();
for (int rowNum = 0; rowNum < sheet.getLastRowNum() + 1; rowNum++) {
Row r = sheet.getRow(rowNum);
String val = null;
for (int i = 0; i < r.getLastCellNum() + 1; i++) {
Cell cell = r.getCell(i);
val = formatter.formatCellValue(cell);
}
al.add(val);
mainArrayList.add(al);
System.out.println(mainArrayList);
}
输出:
[[]]
[[, ], [, ]]
[[, , ], [, , ], [, , ]]
[[, , , ], [, , , ], [, , , ], [, , , ]]
我相信是因为我宣布了我的String val = null;
。
我对ArrayList提出了新问题>
How to store data from excel to ArrayList>
完整答案
谢谢我们的朋友Bejond帮助我解决了这个问题,下面是完整的代码:
public static void main(String[] args) {
try {
FileInputStream file = new FileInputStream(new File("xx"));
XSSFWorkbook wb = new XSSFWorkbook(file);
XSSFSheet sheet = wb.getSheetAt(0);
DataFormatter formatter = new DataFormatter();
ArrayList<ArrayList<String>> mainArrayList = new ArrayList<ArrayList<String>>();
ArrayList<String> al = null;
for (int rowNum = 0; rowNum < sheet.getLastRowNum() + 1; rowNum++) {
al = new ArrayList<String>();
String val = null;
Row r = sheet.getRow(rowNum);
for (int m = 0; m <= r.getLastCellNum() + 1; m++) {
Cell cell = r.getCell(m);
val = formatter.formatCellValue(cell);
al.add(val);
}
mainArrayList.add(al);
}
for (int t = 0; t < mainArrayList.size(); t++) {
ArrayList<String> row = mainArrayList.get(t);
for (int i = 0; i < row.size(); i++) {
if (row.get(i).equals("13") && row.get(i - 1).equals("12")) {
// your code
ArrayList tempRow = mainArrayList.get(t - 1);
if (tempRow.size() > 0) {
if (tempRow.get(2).equals("3")) {
System.out.println("FOUND");
break;
}else {
System.out.print("nope");
continue;
}
} else {
System.out.print("false");
continue;
}
}
}
}
} catch (
Exception e) {
e.printStackTrace();
}
}
在此代码中,如果您与以前的原始代码进行比较,我做了一些更改,建议ArrayList> mainArrayList = new ArrayList>(); 。
然后进行检查,我检查它何时发现值“ 13”并且上一个索引等于“ 12”,它将转到上一行以在索引2处检查值“ 3”是否存在是否。
答案 0 :(得分:1)
首先,您的数据结构不好。建议您创建一个ArrayList<ArrayList<String>>
来保存数据。将每一行放入一个ArrayList中,然后将ArrayList添加到主ArrayList中。现在,数据结构与您上面提到的相同。或者,您可以选择二元数组,例如String[][] arr = new String[10][];
。
您在ArrayList<String> al = new ArrayList<String>();
中放置行for loop
,这意味着在每个循环中,您将创建一个新的ArrayList al
,因此al
中的数据在每个循环中都为空。如果您希望al
保留所有数据,则需要将ArrayList<String> al = new ArrayList<String>();
移出循环。
对于您的代码,当(al.get(t).equals("h") && al.get(t + 1).equals("") && al.get(t + 2).equals(""))
为true时,rowNum为3,al为[a, s, d, f, g, h, , ]
,al.get(rowNum-1)为“ d”。
当(al.get(t).equals("16") && al.get(t + 1).equals("") && al.get(t + 2).equals(""))
为true时,rowNum为2,al为[11, 12, 13, 14, 15, 16, , ]
,al.get(rowNum -1)为“ 12”。
此外,您不应使用al.get(rowNum - 1).contains("11")
,而应使用al.get(rowNum - 1).equals("11")
。
=================
for (int t = 0; t < mainArrayList.size(); t++) {
ArrayList<String> row = mainArrayList.get(t);
for (int i = 0; i < row.size(); i++) {
if (row.get(i).equals("h") {
// your code
}
}
}
row
是工作表的每一行。您需要循环每一行以检查每个与“ h”相等的String。