如何获取上一行arraylist java

时间:2018-11-01 01:45:50

标签: java apache-poi

我有这样的数组列表

[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”是否存在是否。

1 个答案:

答案 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。