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
私は基本的にこのオールドスクールな方法をやって考えていました
- 通貨に基づいてデータをソートします。
- 反復リストと地図にデータを入れて(データがソートされているので、私は重複したキーを取得するまで、新しい地図に(プライマリアカウントを対応するデータを置く作業を開始します)
- プライマリアカウントレベルで基本的に上記のプロセスを繰り返し、(リストオブジェクト内のサブアカウント)値のデータを、対応する重複キーを置く開始
私の思考プロセス用として、私は、ネストされたマップのプライマリアカウントで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()
ヌルキーを許可していない、あなたが実際にダミーのキーを使用する必要がありますので、。