解決できないと思われる問題が2つあります。1つ目は、ユーザーが渡すことができる1-n個のネストされたグループが存在する可能性がある場所で動的なネストされたグループ化を行う方法が必要です。
2番目の問題は、キーがネストされているのではなく、連結されている場合に結果をフラット化する必要があることです。
私の入力例は次のようになります。
List<Map<String, String>> fakeData = new LinkedList<>();
Map<String, String> data1 = new HashMap<>();
data1.put("ip","10.0.1.0");
data1.put("uid","root");
data1.put("group","admin");
fakeData.add(data1);
Map<String, String> data2 = new HashMap<>();
data2.put("ip","10.0.1.1");
data2.put("uid","tiger");
data2.put("group","user");
fakeData.add(data2);
Map<String, String> data3 = new HashMap<>();
data3.put("ip","10.0.1.1");
data3.put("uid","woods");
data3.put("group","user");
fakeData.add(data3);
最終結果には、マップキーの連結が含まれます。
{
"10.0.1.1user": [
{
"uid": "tiger",
"ip": "10.0.1.1",
"group": "user"
},
{
"uid": "woods",
"ip": "10.0.1.1",
"group": "user"
}
],
"10.0.1.0admin": [
"uid": "root",
"ip": "10.0.1.0",
"group": "admin"
]
}
キーは、マップ内のネストされたマップではなく、連結されていることに注意してください。
運がなくても動的にできるグループ化を作成しようとしています。
fakeData.stream()
.collect(groupingBy(map -> map.get("ip"),
groupingBy(map -> map.get("uuid"),
... nested "n" times)));
これは私が実装しようとしているインターフェースです:
public Map<String, List<Map<String, String>>> doGrouping(List<String> columns,
List<Map<String, String>> data);
次のことを試してください。
public Map<String, List<Map<String, String>>> doGrouping(
List<String> columns,
List<Map<String, String>> data) {
return data.stream()
.collect(Collectors.groupingBy(
elem -> columns.stream()
.map(elem::get)
.collect(Collectors.joining())));
}
まず、data
マップのリストであるをストリーミングしました。ストリームのCollectors.groupingBy
各要素に対して計算されたキーを使用して、すぐにリストのマップにストリームを収集しました。
キーの計算は難しい部分でした。このために、指定されたリストをストリーミングし、columns
これらの列のそれぞれをストリームの要素の対応する値に変換しました。マッピング関数としてStream.map
渡すメソッドを使用してこれを行いましたelem::map
。最後に、を使用してこの内部ストリームを単一の文字列に収集しました。これCollectors.joining
により、ストリームの各要素が効率的な方法で最終的な文字列に連結されます。
編集:上記のコードは、のすべての要素columns
がのマップ要素のキーとして存在する場合に適切に機能しdata
ます。より安全にするには、以下を使用します。
return data.stream()
.collect(Collectors.groupingBy(
elem -> columns.stream()
.map(elem::get)
.filter(Objects::nonNull)
.collect(Collectors.joining())));
このバージョンでnull
は、ストリームから要素が除外されます。これは、一部のマップ要素にcolumns
リストで指定されたキーが含まれていない場合に発生する可能性があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加