構造化リストデータのJava 8を使用して、マップの構造にそれを正規化します

user1697113:

だから、私はまだJavaの8に新しいですし、今でも伝統的な反復とコレクションとストリームAPIを相関させるために奮闘します。

私は3つのプロパティを持つオブジェクト「のUserData」のリストを持っているので、リストには、すべての非正規化データです。

 public class UserData {

        private String primaryAccountNumber;
        private String subAccountNumber;
        private String currency;
}

サンプル入力データは次のようになります

PrimaryAccNumber     SubAccNumber   Currency
PA00                 US00           USD
PA01                 US01           USD
PA01                 US02           USD
PA02                 EU00           EUR
PA03                 EU01           EUR
PA04                 CA00           CAD
PA04                 CA01           CAD
null                 IN00           INR
null                 IN01           INR

予想される出力は次のようなものでなければなりません

USD  -> PA00 -> [US00]
        PA01 -> [US01,US02]
EUR  -> PA02 -> [EU00]
     -> PA03 -> [EU01]
CAD  -> PA04 -> [CA00,CA01]
INR  -> null (or dummykey)->[IN00,IN01]

だから、私はそれが出て来るように正規化することにしたいことは、通貨および値とキー地図は、プライマリのAccとサブアカウントの一覧で値をキーと別の地図であるべきです。

Map<String, Map<String,List<String>>> normalizedData = //logic

私は基本的にこのオールドスクールな方法をやって考えていました

  1. 通貨に基づいてデータをソートします。
  2. 反復リストと地図にデータを入れて(データがソートされているので、私は重複したキーを取得するまで、新しい地図に(プライマリアカウントを対応するデータを置く作業を開始します)
  3. プライマリアカウントレベルで基本的に上記のプロセスを繰り返し、(リストオブジェクト内のサブアカウント)値のデータを、対応する重複キーを置く開始

私の思考プロセス用として、私は、ネストされたマップのプライマリアカウントで2つのリストのコピー(最初の反復のための通貨で1つのソート)、2回目の並べ替えを作成する必要があります。その後、私はストリームに見えたが、私はそれらを使用することができますどのように可視化することができませんでしたが、どの指導や考えが理解されるだろう、少し非効率です。

shmosel:

これは、ストリームと非常に簡単です。あなたは最後に、ネストされたグループとマッピングのカップルを必要とします。簡潔にするために、私はあなたの静的インポートを持っていると仮定しますjava.util.stream.Collectors.*

Map<String, Map<String, List<String>>> normalizedData = users.stream().collect(
        groupingBy(UserData::getCurrency,
                groupingBy(UserData::getPrimaryAccountNumber,
                        mapping(UserData::getSubAccountNumber, toList()))));

groupingBy()ヌルキーを許可していない、あなたが実際にダミーのキーを使用する必要がありますので、。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=226472&siteId=1