2017-12-20 14 views
3

私はMap<Date, List<Integer>>を持っているとしましょう。整数のリストは、抽選で投げられた数字のリストに過ぎません。それは次のようになります。Map <Date、List <Integer>>

Wed Nov 15 13:31:45 EST 2017=[1, 2, 3, 4, 5, 6], 
Wed Nov 22 13:31:45 EST 2017=[7, 8, 9, 10, 11, 12], 
Wed Nov 29 13:31:45 EST 2017=[13, 14, 15, 16, 17, 18], 
Wed Dec 13 13:31:45 EST 2017=[1, 19, 20, 21, 22, 23], 
Wed Dec 20 13:31:45 EST 2017=[24, 25, 26, 27, 28, 29] 

私は鍵が宝くじ番号であり、値は数がスローされた最後の日付であるマップ、にそのマップを変換する必要があります。 49.

まで 1 =水曜日12月13日13時31分45秒EST 2017 2 =水曜日11月15日13時31分45秒EST 2017 などだから、質問は次のとおりです:ようなもの、それはそれを行うことが可能ですJava 8ストリームを使用しています。

ありがとうございます。

答えて

3

私は間違っていないよ場合は、(DateComparableであると仮定して)このような何かを探しています:

map.entrySet() 
      .stream() 
      .flatMap(x -> x.getValue().stream().map(y -> new AbstractMap.SimpleEntry<>(x.getKey(), y))) 
      .collect(Collectors.groupingBy(
        Entry::getValue, 
        Collectors.collectingAndThen(
          Collectors.maxBy(Comparator.comparing(Entry::getKey)), 
          x -> x.get().getKey()))); 
+0

これは機能します。ありがとうございました。今私はそれを理解する必要があります。 )))) – EasyRider

+1

@EasyRider IDEに入れて各ステップで 'x、y'が何であるかを知ることは、もっと理解しやすいかもしれません... – Eugene

+0

' collect'ステップを簡単にするには 'Collectors .toMap(Map.Entry :: getValue、Map.Entry :: getKey、BinaryOperator。 maxBy(Comparator.naturalOrder())) – Flown

1

ここで(ただし、ストリームなし)それを行うにsuccint方法があります:

Map<Integer, Date> result = new HashMap<>(); 
map.forEach((date, list) -> list.forEach(n -> result.merge(n, date, 
    (oldDate, newDate) -> newDate.after(oldDate) ? newDate : oldDate))); 

これはmapマップを反復し、(date, list)ペアのそれぞれについて、listの番号のリストを反復します。次にMap.mergeDate.afterのメソッドを使用して、resultマップに最後の日付だけが指定された番号にマッピングされるようにエントリを入れます。

+1

私は誓う!*私はここであなたに会いに行くことを知っていた。私もあなたの最後のニュースレターを楽しんだ(かなりたくさん) – Eugene

+0

@ユージン、ありがとう、男...本当にありがとう。私は第2部を書いています(脱線イントロは準備ができています)。 Btw、フラットマップのバグに対する素晴らしい答え。最初から明確です。彼らはそれが100%怠け者になるようにそれらを修正したいと思います... –

+0

フェデリコありがとうございます。それも同様に動作します。また、理解しようとします。 :-)申し訳ありませんが、私はすでにユージーンの答えを受け入れたとマークしています。 – EasyRider

関連する問題