拆分流并从文本文件放入列表 [英] Split stream and put into list from text file
问题描述
如何将我从文本文件中读取的所有元素放入 ArrayList <MonitoredData >
使用streams,其中monitoredData 类有这3 个私有变量:私有日期开始时间、日期结束时间、字符串活动标签
;
How can I put all the elements I read from a text file into an ArrayList < MonitoredData >
using streams, where monitoredData class has these 3 private variables: private Date startingTime, Date finishTime, String activityLabel
;
文本文件活动.txt 如下所示:
The text File Activities.txt looks like this:
2011-11-28 02:27:59 2011-11-28 10:18:11 Sleeping
2011-11-28 10:21:24 2011-11-28 10:23:36 Toileting
2011-11-28 10:25:44 2011-11-28 10:33:00 Showering
2011-11-28 10:34:23 2011-11-28 10:43:00 Breakfast
等等......
前 2 个字符串由一个空格分隔,然后是 2 个制表符,再次是一个空格,2 个制表符.
The first 2 strings are separated by one blank space, then 2 tabs, one space again, 2 tabs.
String fileName = "D:/Tema 5/Activities.txt";
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
list = (ArrayList<String>) stream
.map(w -> w.split(" ")).flatMap(Arrays::stream)
.collect(Collectors.toList());
} catch (IOException e) {
e.printStackTrace();
}
推荐答案
你需要引入一个工厂来创建MonitoredData
,在示例中我使用一个Function
从 String[]
创建一个 MonitoredData
:
you need introduce a factory to create the MonitoredData
, in example I'm using a Function
to create a MonitoredData
from String[]
:
Function<String[],MonitoredData> factory = data->{
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try{
return new MonitoredData(format.parse(data[0]),format.parse(data[1]),data[2]);
// ^--startingTime ^--finishingTime ^--label
}catch(ParseException ex){
throw new IllegalArgumentException(ex);
}
};
THEN 您的代码对流的操作应该如下所示,并且您不需要使用 Collectors#toCollection:
THEN your code operate on a stream should be like below, and you don't need casting the result by using Collectors#toCollection:
list = stream.map(line -> line.split(" ")).map(factory::apply)
.collect(Collectors.toCollection(ArrayList::new));
这篇关于拆分流并从文本文件放入列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!