From 6d6510c22372a048030e81082116f92bf80218a7 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 13 Jul 2023 17:09:18 -0500 Subject: [PATCH] Add swapMultiLevelMapKeys --- .../backend/core/utils/CollectionUtils.java | 36 +++++++++++++++++++ .../core/utils/CollectionUtilsTest.java | 23 ++++++++++++ 2 files changed, 59 insertions(+) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/CollectionUtils.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/CollectionUtils.java index f817b6b3..ecb5aca5 100755 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/CollectionUtils.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/CollectionUtils.java @@ -627,4 +627,40 @@ public class CollectionUtils } } + + + /******************************************************************************* + ** Take a multi-level map, e.g., Map{String, Map{Integer, BigDecimal}} + ** and invert it - e.g., to Map{Integer, Map{String, BigDecimal}} + *******************************************************************************/ + public static Map> swapMultiLevelMapKeys(Map> input) + { + if(input == null) + { + return (null); + } + + Map> output = new HashMap<>(); + + for(Map.Entry> entry : input.entrySet()) + { + K1 key1 = entry.getKey(); + Map map1 = entry.getValue(); + + if(map1 != null) + { + for(Map.Entry entry2 : map1.entrySet()) + { + K2 key2 = entry2.getKey(); + V value = entry2.getValue(); + + output.computeIfAbsent(key2, (k) -> new HashMap<>()); + output.get(key2).put(key1, value); + } + } + } + + return (output); + } + } diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/CollectionUtilsTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/CollectionUtilsTest.java index 80425535..62c0573e 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/CollectionUtilsTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/CollectionUtilsTest.java @@ -34,6 +34,7 @@ import java.util.TreeMap; import java.util.function.Function; import com.google.gson.reflect.TypeToken; import com.kingsrook.qqq.backend.core.BaseTest; +import com.kingsrook.qqq.backend.core.utils.collections.MapBuilder; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -594,4 +595,26 @@ class CollectionUtilsTest extends BaseTest } + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testSwapMultiLevelMapKeys() + { + Map> input = MapBuilder.of( + "A", Map.of(1, "A1", 2, "A2", 3, "A3"), + "B", Map.of(1, "B1", 4, "B4"), + "C", null); + + Map> output = CollectionUtils.swapMultiLevelMapKeys(input); + + assertEquals(MapBuilder.of( + 1, Map.of("A", "A1", "B", "B1"), + 2, Map.of("A", "A2"), + 3, Map.of("A", "A3"), + 4, Map.of("B", "B4")), output); + } + }