用Java写文本到文件

时间:2017-10-24 14:54:51

标签: java

我试图将简单的输出写入文件,但我输错了输出。这是我的代码:

Map<Integer,List<Client>> hashMapClients = new HashMap<>();
hashMapClients = clients.stream().collect(Collectors.groupingBy(Client::getDay));

Map<Integer,List<Transaction>> hasMapTransactions = new HashMap<>();
hasMapTransactions = transactions.stream().collect(Collectors.groupingBy(Transaction::getDay));

//DAYS
String data;
for (Integer key: hashMapClients.keySet()) {
    data = key + " | ";
    for (int i = 0; i <hashMapClients.get(key).size();i++) {
        data += hashMapClients.get(key).get(i).getType() + " | " + hashMapClients.get(key).get(i).getAmountOfClients() + ", ";
        writer.println(data);
    }
}

我得到了这个输出

  

1 |个人| 0,

     

1 |个人| 0,公司| 0,

     

2 |个人| 0,

     

2 |个人| 0,公司| 0,

但它应该是,如果它是最后一个,它也不应该结束。

  

1 |个人| 0,公司| 0
  2 |个人| 0,公司   | 0

我做错了什么?

2 个答案:

答案 0 :(得分:2)

听起来您只想将data写入外部循环中的输出,而不是内部循环。后者仅用于构建要写入的data值。像这样:

String data;
for (Integer key: hashMapClients.keySet()) {
    // initialize the value
    data = key + " | ";

    // build the value
    for (int i = 0; i <hashMapClients.get(key).size();i++) {
        data += hashMapClients.get(key).get(i).getType() + " | " + hashMapClients.get(key).get(i).getAmountOfClients() + ", ";
    }

    // write the value
    writer.println(data);
}

编辑:感谢您指出最后一个字符仍然需要删除。没有更多的错误检查,可能就像:

一样简单
data = data.substring(0, data.length() - 1);

您可以根据逻辑需要添加错误检查,也许确认最后一个字符确实是逗号或确认内部循环至少执行一次,等等。

答案 1 :(得分:0)

一个问题是你在每println之后调用Client,而不是等到整个列表构建完毕。然后,要使用尾随逗号修复问题,您可以使用joining collector.

Map<Integer,List<Client>> clientsByDay = clients.stream()
  .collect(Collectors.groupingBy(Client::getDay));
/* Iterate over key-value pairs */
for (Map.Entry<Integer, List<Client>> e : clientsByDay) {
    /* Print the key */
    writer.print(e.getKey());
    /* Print a separator */
    writer.print(" | ");
    /* Print the value */
    writer.println(e.getValue().stream()
      /* Convert each Client to a String in the desired format */
      .map(c -> c.getType() + " | " + c.getAmountOfClients())
      /* Join the clients together in a comma-separated list */
      .collect(Collectors.joining(", ")));
}