有一个HashMap:
HashMap<String, Object> matrix = new HashMap<String, Object>();
考虑到Object是一个带有数据的ArrayList:
for (int i = 0; i < matrix.keySet().size() * 2; i += 2) {
keyRow.createCell(i).setCellValue(matrix.keySet().toArray()[i / 2].toString());
for (int j = 5; j < (((ArrayList<String>) matrix.get(matrix.keySet().toArray()[i / 2].toString())).size() + 5); j++) {
valueRow = worksheet.createRow((short) j);
valueRow.createCell(i).setCellValue(((ArrayList<String>) matrix.get(matrix.keySet().toArray()[i / 2].toString())).toArray()[j - 5].toString());
}
}
正如您所看到的,外部循环使用HashMap的keySet()的字符串填充keyRow,同时在两者之间的空单元格后面(它增加2)。 内循环应该用每个对应的值填充每个键下的单元格(这是一个具有更多值的ArrayList,这就是为什么是另一个循环)。除了APACHE POI worksheet.createRow()方法覆盖以前的结果之外,它的工作非常漂亮,只给出了一个键正确填充的最终结果。
您对我如何解决问题有任何想法吗?我非常感谢你。
答案 0 :(得分:3)
你的代码天真;学会正确使用Collections API,完整的Generic类型,Iterable for循环,并且没有毫无意义的使用toArray(),map gets或short。
我建议你试试:
Map<String, ArrayList<String>> matrix = new HashMap<String, ArrayList<String>>();
int cell=0;
int row=0;
for (Map.Entry<String,Object> e : matrix.entrySet()) {
worksheet.createRow(row++).createCell(cell).setCellValue(e.getKey());
Row valueRow = worksheet.createRow(row++);
for (String v : e.getValue()) {
valueRow.createCell(cell++).setCellValue(v);
}
}
如果您想要键值的排序或源序列列表,您可能需要考虑使用TreeMap或LinkedHashMap。