I want to sort a Map by value length. For example, I have this code:
public static void main(String[] args) { Map<Integer, Map<Integer, Integer>> map = new HashMap<>(); Random random = new Random(); for (int i = 0; i < 5; i++) { Map<Integer, Integer> mapA = new HashMap<>(); for (int j = 0; j < random.nextInt(10); j++) { mapA.put(j, j); } map.put(i, mapA); } for (Map.Entry<Integer, Map<Integer, Integer>> entry: map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } }
and the result is:
0: {0=0, 1=1, 2=2, 3=3, 4=4, 5=5} 1: {} 2: {0=0, 1=1, 2=2, 3=3} 3: {0=0, 1=1, 2=2, 3=3} 4: {0=0, 1=1, 2=2}
so what I want to do is to sort this Map by value length, so it returns:
1: {} 4: {0=0, 1=1, 2=2} 2: {0=0, 1=1, 2=2, 3=3} 3: {0=0, 1=1, 2=2, 3=3} 0: {0=0, 1=1, 2=2, 3=3, 4=4, 5=5}
Advertisement
Answer
You can use Streams to do this:
var sorted = map.entrySet().stream().sorted(Comparator.comparingInt(it -> it.getValue().size())).toList();
Basicly you just need a custom Comparator
which will get the value of a Map.Entry
and compare the size()
of that value which in your case is another Map
.
Here the full application:
import java.util.*; public class Application { public static void main(String[] args) { Map<Integer, Map<Integer, Integer>> map = new HashMap<>(); Random random = new Random(); for (int i = 0; i < 5; i++) { Map<Integer, Integer> mapA = new HashMap<>(); for (int j = 0; j < random.nextInt(10); j++) { mapA.put(j, j); } map.put(i, mapA); } for (Map.Entry<Integer, Map<Integer, Integer>> entry: map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } var sorted = map.entrySet().stream().sorted(Comparator.comparingInt(it -> it.getValue().size())).toList(); System.out.println(sorted); } }
Expected output:
0: {0=0, 1=1} 1: {0=0, 1=1, 2=2, 3=3, 4=4} 2: {} 3: {0=0} 4: {0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7} [2={}, 3={0=0}, 0={0=0, 1=1}, 1={0=0, 1=1, 2=2, 3=3, 4=4}, 4={0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7}]
Obviously the exact output depends on the randomized input.