Mam dwie mapy:Korzystanie Java 8 lambdas/transformacje połączyć i spłaszczyć dwie mapy
Map<A, Collection<B>> mapAB
Map<B, Collection<C>> mapBC
chciałbym, aby przekształcić je w Map<A, Collection<C>> mapAC
i jestem zastanawiasz się, czy jest to gładki sposób na lambda i transformacje. W moim przypadku kolekcje są kompletami, ale chciałbym rozwiązać problem ogólnie dla kolekcji.
Jedna myśl, jaką miałem, to najpierw połączyć dwie mapy w Map<A, Map<B, Collection<C>>>
, a następnie spłaszczyć, ale jestem otwarty na każde podejście.
noty danych: B
powinien występować jedynie w zbiorze wartości związanej z jednym A
i to samo jest prawdą dla mapBC
(dane są odwzorowywane C
tylko z jednego B
). W rezultacie powinna istnieć tylko jedna ścieżka od danego A
do danego C
, chociaż mogą istnieć odwzorowania, dla których nie ma odwzorowań i mogą istnieć odwzorowania , dla których nie ma odpowiednich odwzorowań A -> B
. Te sieroty po prostu nie pojawiają się w wynikowym mapAC
.
Dla porównania, oto przykład czysto bezwzględnej podejścia do tego samego problemu:
Map<A, Collection<C>> mapAC = new HashMap<>();
for (Entry<A, Collection<B>> entry : mapAB.entrySet()) {
Collection<C> cs = new HashSet<>();
for (B b : entry.getValue()) {
Collection<C> origCs = mapBC.get(b);
if (origCs != null) {
cs.addAll(origCs);
}
}
if (!cs.isEmpty()) {
mapAC.put(entry.getKey(), cs);
}
}
Czy chcesz połączyć dwie relacje jeden-do-wielu bez środkowej kolumny? –
@MikeSamuel tak, to zdecydowanie jeden sposób, aby na to spojrzeć. –
Czy możesz dodać przykład danych? Na przykład, jeśli mamy 'Mapę>' i 'Map >' czy jest możliwe, aby różne osoby miały tę samą pracę, lub dla kilku zadań używały tych samych narzędzi? Czy możliwe jest coś takiego jak 'p1 -> {j1, j2}, p2 -> {j2, j3}'? Również 'job1 -> {tool1, tool2} job2 -> {tool2, tool3} job3 -> {tool4}'? Jakie wyniki oczekujesz? Czy chcesz też, aby 'Collection ' było 'Set' lub czy elementy istnieją w nim wiele razy? –
Pshemo