Java 使用ApacheCommonsCSV从带有头的HashMaps列表中写入CSV

Java 使用ApacheCommonsCSV从带有头的HashMaps列表中写入CSV,java,apache-commons,apache-commons-csv,Java,Apache Commons,Apache Commons Csv,我必须使用HashMap的ArrayList并使用apachecommons CSV创建一个CSV。但是,它没有将值写入正确的头。有没有一种简单的方法可以让库使用枚举自动将值放置到正确的头中?我不想手动分配它,因为我将添加更多列 这就是它产生的结果: 以下是我所拥有的: Header.java public enum Header { FIRST_NAME(), LAST_NAME(), GENDER(); } 主要 publicstaticvoidmain(字符串[

我必须使用
HashMap
ArrayList
并使用apachecommons CSV创建一个CSV。但是,它没有将值写入正确的头。有没有一种简单的方法可以让库使用枚举自动将值放置到正确的头中?我不想手动分配它,因为我将添加更多列

这就是它产生的结果:

以下是我所拥有的:

Header.java

public enum Header
{
    FIRST_NAME(),
    LAST_NAME(),
    GENDER();
}
主要

publicstaticvoidmain(字符串[]args)
{
列表输出=新的ArrayList();
Map Map=newhashmap();
地图放置(标题。名字“John”);
map.put(Header.LAST_NAME,“Andrew”);
地图。放置(标题。性别,“男性”);
输出。添加(映射);
Map map2=新的HashMap();
map2.put(页眉、名字“Sally”);
map2.put(页眉、姓氏“Andrew”);
map2.put(Header.GENDER,“女性”);
output.add(map2);
字符串outputFile=System.getProperty(“java.io.tmpdir”)+“test.csv”;
试一试(
BufferedWriter=Files.newBufferedWriter(path.get(outputFile));
CSVPrinter CSVPrinter=新的CSVPrinter(writer,CSVFormat.DEFAULT
.withHeader(Header.class));)
{
打印记录(输出);
csvPrinter.flush();
}捕获(IOEX异常)
{
Logger.getLogger(TestCSV.class.getName()).log(Level.SEVERE,null,ex);
}
}
这个怎么样:

try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(outputFile));
        CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader(Header.class));) {
    for (Map<Header, String> row : output) {
        csvPrinter.printRecord(Arrays.asList(Header.values())
                                     .stream()
                                     .map(header -> row.get(header))
                                     .collect(Collectors.toList()));
    }
} catch (IOException ex) {
    Logger.getLogger(TestCSV.class.getName())
          .log(Level.SEVERE, null, ex);
}
try(BufferedWriter=Files.newBufferedWriter(path.get(outputFile));
CSVPrinter CSVPrinter=新的CSVPrinter(writer,CSVFormat.DEFAULT.withHeader(Header.class));){
用于(映射行:输出){
打印记录(Arrays.asList(Header.values())
.stream()
.map(标题->行.get(标题))
.collect(Collectors.toList());
}
}捕获(IOEX异常){
Logger.getLogger(TestCSV.class.getName())
.log(Level.SEVERE,null,ex);
}
这个怎么样:

try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(outputFile));
        CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader(Header.class));) {
    for (Map<Header, String> row : output) {
        csvPrinter.printRecord(Arrays.asList(Header.values())
                                     .stream()
                                     .map(header -> row.get(header))
                                     .collect(Collectors.toList()));
    }
} catch (IOException ex) {
    Logger.getLogger(TestCSV.class.getName())
          .log(Level.SEVERE, null, ex);
}
try(BufferedWriter=Files.newBufferedWriter(path.get(outputFile));
CSVPrinter CSVPrinter=新的CSVPrinter(writer,CSVFormat.DEFAULT.withHeader(Header.class));){
用于(映射行:输出){
打印记录(Arrays.asList(Header.values())
.stream()
.map(标题->行.get(标题))
.collect(Collectors.toList());
}
}捕获(IOEX异常){
Logger.getLogger(TestCSV.class.getName())
.log(Level.SEVERE,null,ex);
}

好的,我知道了。我将地图更改为
LinkedHashMap
以保持秩序,然后执行以下操作:

   try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(outputFile));
        CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT
        .withHeader(Header.class));)
   {

        for (Map<Header, String> val : output)
        {
            csvPrinter.printRecord(val.values().toArray());
        }

        csvPrinter.flush();

    } catch (IOException ex)
    {
        Logger.getLogger(TestCSV.class.getName()).log(Level.SEVERE, null, ex);
    }
try(BufferedWriter=Files.newBufferedWriter(path.get(outputFile));
CSVPrinter CSVPrinter=新的CSVPrinter(writer,CSVFormat.DEFAULT
.withHeader(Header.class));)
{
用于(映射值:输出)
{
打印记录(val.values().toArray());
}
csvPrinter.flush();
}捕获(IOEX异常)
{
Logger.getLogger(TestCSV.class.getName()).log(Level.SEVERE,null,ex);
}

好的,我知道了。我将地图更改为
LinkedHashMap
以保持秩序,然后执行以下操作:

   try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(outputFile));
        CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT
        .withHeader(Header.class));)
   {

        for (Map<Header, String> val : output)
        {
            csvPrinter.printRecord(val.values().toArray());
        }

        csvPrinter.flush();

    } catch (IOException ex)
    {
        Logger.getLogger(TestCSV.class.getName()).log(Level.SEVERE, null, ex);
    }
try(BufferedWriter=Files.newBufferedWriter(path.get(outputFile));
CSVPrinter CSVPrinter=新的CSVPrinter(writer,CSVFormat.DEFAULT
.withHeader(Header.class));)
{
用于(映射值:输出)
{
打印记录(val.values().toArray());
}
csvPrinter.flush();
}捕获(IOEX异常)
{
Logger.getLogger(TestCSV.class.getName()).log(Level.SEVERE,null,ex);
}

您想使用jackson csv或open csv将csv读取为java pojo,因此您不必声明更多枚举不确定您的意思,因为我想专门定义标题您想使用jackson csv或open csv将csv读取为java pojo,因此您不必声明更多枚举不确定您的意思,因为我想特别定义HeadersThank,这看起来比我的更好,因为顺序是从Enum中获取的。谢谢,这看起来比我的更好,因为顺序是从Enum中获取的。