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は元々順番が揃っていないようにしています