2017-03-08 9 views
2

私はこの形式で日付オブジェクトを格納するリストを持っている:Java - 日付リストをフィルタリングする方法は?

Mon Jan 30 18:00:00 GMT+00:00 2017 
Mon Jan 30 21:00:00 GMT+00:00 2017 
Tue Jan 31 00:00:00 GMT+00:00 2017 
Tue Jan 31 03:00:00 GMT+00:00 2017 
Tue Jan 31 06:00:00 GMT+00:00 2017 

私は私のリストをフィルタリングし、それぞれの日のための唯一の最後の日付を維持するための方法が必要です。

これは私のコードの現在の状況である:ここでは

for(int i = 0; i< timeDate.size(); i++){ 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(timeDate.get(i)); 

     int day = calendar.get(Calendar.DAY_OF_MONTH); 
     int month = calendar.get(Calendar.MONTH); 
     int hour = calendar.get(Calendar.HOUR); 

     for(int j=i; j<timeDate.size(); j++){ 
      Date currentDate = timeDate.get(j); 
      calendar.setTime(currentDate); 

      int dayC = calendar.get(Calendar.DAY_OF_MONTH); 
      int monthC = calendar.get(Calendar.MONTH); 
      int hourC = calendar.get(Calendar.HOUR); 

      if(day==dayC && month==monthC && hourC > hour){ 
       timeDate.remove(i); 
      } 
     } 
    } 
+2

日付オブジェクトの署名は何ですか?あなたのコードの現在の状態は何ですか? –

+4

あなたはこれまでに何を試しましたか? [mcve]を作成し、問題を説明してください。 – MBec

+0

ちょうど入れました –

答えて

0

CalendarDateクラスは、Javaに取って代わられているjava.time

を使用します。タイムクラス。 Plagueのような面倒なレガシークラスは避けてください。

それぞれをDateに変換すると、Instantというタイムライン上の瞬間がUTCで与えられます。

Instant instant = myDate.toInstant(); 

Listに集めてください。ダルシャンによって回答に見られるように

List<> instants = new ArrayList<>(); 
instants.add(myDate.toInstant()); 
… 
Collections.reverse(instants); // if not already in descending sorted order. 

、地図を作るが、LocalDateZonedDateTimeの。

Instantにタイムゾーンを割り当てて、ZonedDateTimeにする必要があります。任意の瞬間について、日付は地球の周りでゾーンごとに異なります。

ZoneId z = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(); 

LocalDateを抽出する。

LocalDate ld = zdt.toLocalDate(); 

マップするキーとしてこれを使用します。そのようなキーがない場合は、それを追加して、そのマップエントリの値としてZonedDateTimeを追加します。

その日付のキーがある場合は、ZonedDateTimeの値を取得して比較します。 isAfterメソッドと比較してください。手元にある場合は値を置き換えます。

ヒント:Collections.reverse(instants)のように入力を最新のものから並べ替えると、最適化することができます。特定のLocalDateのキーが見つかった場合は、isAfterへの呼び出しで確認してください。そのキーに入力された値はすでに最新のものです。次の入力に移動します。

マップを確認しなくても、さらに最適化することができます。最後にLocalDateが地図に追加されたことを忘れないでください。受信LocalDateと比較してisEqualを呼び出してください。等しい場合は、次の入力に進みます。

3

あなたが行く:

public static void main(String[] args){ 
    List<String> list = new ArrayList<>(); 
    SimpleDateFormat dateFomat = new SimpleDateFormat("E MMM dd hh:mm:ss z yyyy"); 
    SimpleDateFormat yyyyMMddFormat = new SimpleDateFormat("yyyyMMdd"); 
    list.add("Mon Jan 30 18:00:00 GMT+00:00 2017"); 
    list.add("Mon Jan 30 21:00:00 GMT+00:00 2017"); 
    list.add("Tue Jan 31 00:00:00 GMT+00:00 2017"); 
    list.add("Tue Jan 31 03:00:00 GMT+00:00 2017"); 
    list.add("Tue Jan 31 06:00:00 GMT+00:00 2017"); 

    Map<String, List<Date>> dateMap = list.stream() 
    .map(s -> { 
     try { 
      return dateFomat.parse(s); 
     } catch (ParseException e) { 
      throw new RuntimeException(e); 
     } 
    }) 
    .collect(Collectors.groupingBy(s -> yyyyMMddFormat.format(s), Collectors.toList())); 

    List<Date> lastDates = new ArrayList<>(); 
    for(Map.Entry<String, List<Date>> entry : dateMap.entrySet()){ 
     lastDates.add(Collections.max(entry.getValue())); 
    } 

    System.out.println(lastDates); 
} 
+3

'groupingBy'のダウンストリームコレクタとして' Collectors.toList() 'の代わりに' Collectors.collectingAndThen(maxBy(Comparator.naturalOrder())、Optional :: get) 'を使うことができます。このように、余分な反復は必要ありません。 – eee

関連する問題