我正在尝试阅读Excel工作表并将其保存在Java数据结构列表>列表中 基本上我在Excel工作表中有一张桌子
|Name|FirstName|emp_ID|Age|
|aaaa|bbbbbbbbb|111111|40 |
|cccc|fffffffff|222222|25 |
密钥将在哪里
|Name|FirstName|emp_ID|Age|
我的地图列表应如下所示
{Name=aaaa, FirstName=bbbbbbbbb, emp_ID=111111, Age=40}
{Name=cccc, FirstName=fffffffff, emp_ID=222222, Age=25}
但是我的列表存储了第二张地图两次
{Name=cccc, FirstName=fffffffff, emp_ID=222222, Age=25}
{Name=cccc, FirstName=fffffffff, emp_ID=222222, Age=25}
请问如何解决此问题的任何想法或任何更好的建议
预先谢谢你
这是我写的代码
workbook = WorkbookFactory.create(inStream);
workSheet = workbook.getSheetAt(0);
DataFormatter df = new DataFormatter();
Map<String, String> myMap = new LinkedHashMap<>();
List<Map<String, String>> list = new ArrayList<>();
row = workSheet.getRow(0);
ArrayList<String> headersName = new ArrayList<String>();
for (int j = 0; j <= row.getPhysicalNumberOfCells(); j++) {
row.getCell(j);
if ((df.formatCellValue(row.getCell(j)).isEmpty())) {
continue;
} else {
headersName.add(df.formatCellValue(row.getCell(j)));
}
}
System.out.println(headersName);
OUTER: for (Row myrow : workSheet) {
for (int i = 0; i < myrow.getLastCellNum(); i++) {
if (myrow.getRowNum() == 0) {
continue OUTER;
}
String value = df.formatCellValue(myrow.getCell(i));
myMap.put(headersName.get(i), value);
}
list.add(myMap);
}
System.out.println(list.size());
for (Map<String, String> map : list) {
System.out.println(map);
}
我的列表的打印 {Name = cccc,FirstName = fffffffff,emp_ID = 222222,Age = 25} {Name = cccc,FirstName = fffffffff,emp_ID = 222222,Age = 25}
答案 0 :(得分:0)
问题出在myMap.put(headersName.get(i), value)
。在该行中,如果键已存在于地图中,则它将覆盖它。但是后来,list.add(myMap)
传递了对同一地图的引用,而不是其新版本。因此,在第二次迭代中,当该行覆盖该值时,它会在列表中已存在的第一张地图上覆盖它。请参见下面的同一问题的基本示例。
import java.util.*;
public class Example {
public static void main(String []args) {
Map<String, String> myMap = new LinkedHashMap<>();
List<Map<String, String>> list = new ArrayList<>();
myMap.put("abc", "123");
list.add(myMap);
System.out.println(list.get(0));
myMap.put("abc", "234");
System.out.println(myMap);
System.out.println(list.get(0));
}
}
要解决此问题,请查看deep copies,以便仅更改一项不会全部更改。