デトフィア

プログラミング

JavaのLinkedHashMapの要素順序を反転させる

Mapのkeyとvalueを反転させるにはMapUtilsのinvertMapを使います

Map<String,String> mapA = new HashMap<>();
mapA.put("keyA","valueA");
mapA.put("keyB","valueB");
mapA.put("keyC","valueC");
Map<String,String> invMap = MapUtils.invertMap(mapA);

では要素の並びを反転させるにはどうしたらいいでしょうか まずJavaではLinkedHashMapを使うことで要素を追加した順番を担保できます

というわけでMapの要素を逆順にするコードを書きました

public static <T,R> Map<T,R> reverse(Map<T,R> map){
    List<T> mapmapper = map.keySet().stream().collect(Collectors.toList());
    Collections.reverse(mapmapper);
    return mapmapper
            .stream()
            .collect(Collectors.toMap(
                    k -> k, k -> map.get(k), (k, v) -> v, LinkedHashMap::new));
}

やり方は色々あると思いますが、最初にkeyだけの逆順リストを作成します。 あとはそれを順番に回して新しいLinkedHashMapを作成するという単純な処理です。

HashMapだと勝手にソートされたりします。

これをテストしてみます

@Test
public void test_mycollectionutils_reversemap() {
    Map<String, String> mapA = new LinkedHashMap<>();
    mapA.put("keyA", "valueA");
    mapA.put("keyB", "valueB");
    mapA.put("keyC", "valueC");
    mapA.put("keyE", "valueE");
    mapA.put("keyD", "valueD");

    Map<String, String> reMap = MyMapUtils.reverse(mapA);

    List<String> keys = reMap.keySet().stream().collect(Collectors.toList());
    assertEquals("keyD",keys.get(0));
    assertEquals("keyE",keys.get(1));
    assertEquals("keyC",keys.get(2));
    assertEquals("keyB",keys.get(3));
    assertEquals("keyA",keys.get(4));
}

わかりやすくEとDは元々順番が揃っていないようにしています