Другой вариант - сопоставить каждое значение с числом.Вот один из способов сделать это с помощью потоков:
public static <K, V> Map<V, Long> foo(Map<K, V> map) {
return map.entrySet().stream()
.collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.counting()));
}
Затем вы можете распечатать результаты примерно так:
Map<String, String> map = ...;
foo(map).forEach((k, v) -> System.out.printf("%s %d%n", k, v));
Вы также можете изменить его, чтобы знать какие ключи были сопоставлены с тем же значением.
public static <K, V> Map<V, List<K>> foo(Map<K, V> map) {
return map.entrySet().stream().collect(Collectors.groupingBy(
Map.Entry::getValue,
Collectors.mapping(Map.Entry::getKey, Collectors.toList())
));
}