2017-05-22 3 views
3

どのように私はがmonitoredDataクラスは、これらの3つのプライベート変数がある、ストリーム使っArrayList <MonitoredData>に私は、テキストファイルから読み込むすべての要素を置くことができます:private Date startingTime, Date finishTime, String activityLabelを。スプリットストリームやテキストファイルからリストに入れ

Activities.txtは次のようになり、テキストファイル:再び

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つの文字列を1つの空白で区切られ、その後、2つのタブ、1つのスペース、2つのタブ。あなたは一例で、私はString[]からMonitoredDataを作成するFunctionを使用しています、MonitoredDataを作成するための工場を紹介必要

String fileName = "D:/Tema 5/Activities.txt"; 

    try (Stream<String> stream = Files.lines(Paths.get(fileName))) { 

     list = (ArrayList<String>) stream 
       .map(w -> w.split("\t\t")).flatMap(Arrays::stream) // \\s+ 
       .collect(Collectors.toList()); 

     //list.forEach(System.out::println); 

    } catch (IOException e) { 

     e.printStackTrace(); 
    } 
+5

'w.split()'は3つの文字列の配列を生成します。その配列を 'MonitoredData'にマップする必要があります。 'MonitoredData'に配列を取るコンストラクタを渡すか、コンストラクタを呼び出すラムダを渡します。 – Arkadiy

+0

' Collectors.toList() 'の結果を' ArrayList'にキャストしないでください。宣言された型が 'ArrayList'ではなく' List'である理由があります。結果が 'ArrayList'になるという保証はありません。 – Holger

+0

ご協力ありがとうございます@Arkadiy! – Nico

答えて

3

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

list = stream.map(line -> line.split("\t\t")).map(factory::apply) 
      .collect(Collectors.toCollection(ArrayList::new)); 
関連する問題