以2d矩阵存储网表的内容

时间:2016-03-25 19:14:18

标签: java arrays multidimensional-array

我正在尝试使用selenium获取webtable的内容,然后将内容存储在2d矩阵中。

以下是我的代码:

//Locate the webtable
WebElement reportTable = driver.findElement(By.xpath("//*[@id='pageContainer']/div/div[2]/table[2]")); 

int rowCount = driver.findElements(By.xpath("//*[@id='pageContainer']/div/div[2]/table[2]/tbody/tr")).size();  //Get number of rows
System.out.println("Number of rows : " +rowCount);  

String[][] reportMatrix = new String[rowCount-1][];    //Declare new 2d String array
                               //rowCount-1 because the first row is header which i don't need to store 

int mainColCount = 0;


for(int i=2;i<=rowCount;i++)  //Start count from second row, and loop till last row
{
    int columnCount = driver.findElements(By.xpath("//*[@id='pageContainer']/div/div[2]/table[2]/tbody/tr["+i+"]/td")).size();  //Get number of columns
    System.out.println("Number of columns : " +columnCount);

    mainColCount = columnCount;

    for(int j=1;j<=columnCount;j++)    //Start count from first column and loop till last column
    {
        String text = driver.findElement(By.xpath("//*[@id='pageContainer']/div/div[2]/table[2]/tbody/tr["+i+"]/td["+j+"]/div")).getText();  //Get cell contents

        System.out.println(i + " " + j + " " + text);

        reportMatrix[i-2][j-1] = text;  //Store cell contents in 2d array, adjust index values accordingly
    }
}


//Print contents of 2d matrix
for(int i=0;i<rowCount-1;i++)
{
    for(int j=0;j<mainColCount;j++)
    {
        System.out.print(reportMatrix[i][j] + " ");
    }
    System.out.println();
}   

这给了我一个Null Pointer Exception at&#34; reportMatrix [i-2] [j-1] = text&#34;。

我不明白我做错了什么。当我声明2d数组时,我是否必须给出第二个索引?

提前致谢。

1 个答案:

答案 0 :(得分:0)

除非您是学习多维数组的学生,否则您需要使用的API受限制,只需避免使用数组。你会保持更长时间的安全:)

如果你必须使用2D数组,那么记住你实际上并没有创建矩阵是明智的。您正在创建一维数组,此数组的每个元素都是另一个1D数组。当你这么想的时候,很明显你必须初始化“columns”数组以及“rows”数组。

这一行:

String[][] reportMatrix = new String[rowCount-1][];

将初始化报告矩阵以使rowCount为1行,并为每组列提供null。

在你的第一个循环中,在确定了列数之后,你想要这样做:

reportMatrix[i] = new String[columnCount];

for(int j=1;j<=columnCount;j++) ...

如果需要,这将允许您在每行中包含不同数量的列。

然后,在您的打印循环中,您应该使用数组长度来打印行和列。记得从length属性中减去1,因为这表示数组中元素的数量,我们几乎总是使用零索引for循环。

//Print contents of 2d matrix
for(int i=0; i < reportMatrix.length - 1; i++)
{
    for(int j=0; j < reportMatrix[i].length - 1; j++)
    {
        System.out.print(reportMatrix[i][j] + " ");
    }
    System.out.println();
}