java 中创建Vector二维数组添加一维Vector的问题

 1 //创建对工作薄文件的引用

 2     HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(file));

 3 //创建对工作表的引用

 4     HSSFSheet sheet = workbook.getSheetAt(0);

 5     HSSFRow row;

 6     //获取表格的行数

 7     int  rows = sheet.getPhysicalNumberOfRows();

 8     Vector<String> tabletmp = new Vector<>();

 9         Vector<Vector<String>> tableAllData = new Vector<>(); 

10 

11          for (int r=0; r<rows; r++){

12     //获取单元格中指定的行对象

13             row = sheet.getRow(r);

14             if(row != null){

15                 int cells = row.getPhysicalNumberOfCells();

16                 //读取r行的内容*****************

17                 for(short c=0; c<cells; c++){

18                     HSSFCell cell = row.getCell((short)c);

19                     if(cell != null){

20                          if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING){

21                               tabletmp.add(cell.getStringCellValue());

22                          }else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){

23                          tabletmp.add(cell.getNumericCellValue() + "");

24                        }

25                      }

26                  }

27             tableAllData.add(tabletmp);    

28             tabletmp.removeAllElements();

29         }

30                         

31     }

32     tablePane.addExcel(tableAllData);    

 

这段代码的功能是:读取一个excel表格,并且将表格里的内容添加到二维数组tableAllData变量里面。

看起来没有什么错误,但是实际上运行之后我才发现tableAllData里面的数据全为空。让我百思不得其解。后来我按照书上的方式将tabletmp变量的声明放到循环里才将问题搞定。代码如下:

 

 1 //创建对工作薄文件的引用

 2     HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(file));

 3 //创建对工作表的引用

 4     HSSFSheet sheet = workbook.getSheetAt(0);

 5     HSSFRow row;

 6 //获取表格的行数

 7     int  rows = sheet.getPhysicalNumberOfRows();

 8     for (int r=0; r<rows; r++){

 9     //获取单元格中指定的行对象

10         row = sheet.getRow(r);

11         Vector<String> tabletmp = new Vector<>();

12         if(row != null){

13                 int cells = row.getPhysicalNumberOfCells();

14             //读取r行的内容*****************

15             for(short c=0; c<cells; c++){

16                 HSSFCell cell = row.getCell((short)c);

17                 if(cell != null){

18                          if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING){

19                                  tabletmp.add(cell.getStringCellValue());

20                          }else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){

21                                  tabletmp.add(cell.getNumericCellValue() + "");

22                          }

23                  }

24             }

25             tableAllData.add(tabletmp);    

26         }

27                         

28     }

29     tablePane.addExcel(tableAllData);


想一想,我终于明白为什么了。tableAllData.add(tabletmp) 这段代码只是添加了tabletmp变量的引用,也就是C里面说的指针。tableAllData内所存的数据与tabletmp所存的数据都在同一地址单元内。接下来的这段代码tabletmp.removeAllElements(); 将tabletmp内的数据清空,那么同时tableAllData变量所指向的数组也为空。

 

你可能感兴趣的:(vector)