【问题标题】:Stream<String> Only inputting the last line from Files.lines()Stream<String> 仅从 Files.lines() 输入最后一行
【发布时间】:2015-06-25 00:02:43
【问题描述】:

在我的代码中

Files.lines(Paths.get(fileName), Charset.forName("Cp1252"))
                .filter(k -> k != "")
                .forEach(m -> hashmap.put(LocalDateTime.MIN, m));

从名为“info”(fileName) 的文件中读取行。

1
2
3
4
5
(blank line)

但是,当扫描 HashMap 时,它告诉我只使用此代码插入了最后一行:

int x = 0;
for (HashMap.Entry<LocalDateTime, String> s : hashmap.entrySet()) {
    x++;
    System.out.println(hashmap.size() + ": " + x + ": " + s.getValue());
}

1: 1: 5 只打印一次。

【问题讨论】:

  • .filter(k -&gt; k != "") 不要将字符串与==!= 进行比较。使用equals(或否定!结果)。
  • @Pshemo 错过了,谢谢。
  • …或者只使用.filter(k -&gt; ! k.isEmpty())

标签: java hashmap java-8 java-stream


【解决方案1】:

问题在于您的代码 sn-p 将同一键下的所有行放入HashMap。这段代码

.forEach(m -> hashmap.put(LocalDateTime.MIN, m));

从文件中取出每一行,并将其放在等于LocalDateTime.MIN 的键处。由于HashMap 不能包含多个相同的键,所以在forEach 完成后,最后一项是地图中唯一剩下的一项。

要解决此问题,请选择不同的容器,例如列表,或使用不同的策略将键分配给从文件中读取的行。

【讨论】:

  • 你知道我可以用这种格式做一个迭代计数器,以便我可以将它们设置为不同的键吗?
  • @Rob 不幸的是,Java 没有提供一种简单的方法来做到这一点 (here is a relevant Q&A)。您可以使用 Q&A 中的一些技巧,但这并不理想。
  • AtomicInteger 工作。这很草率,但它确实有效。谢谢!
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
相关资源
最近更新 更多