Насколько я понимаю ваше решение в потоке, ваш код создает
Map<String(lastname),Integer(number of occurence)>
и затем отфильтруйте эту карту, где число вхождений> = 2, и в вашем тестовом примере у вас есть карта с записями:
<"name1",2>
<"name2",2>
Таким образом, упорядочение по значению будет по-прежнему возвращать два значения.
Вы должны попробовать создать
Map<Integer,List<String>>
, в котором будет храниться число вхождений -> имен, затем отфильтровывать ключи карты, сортировать их по убыванию, и (в значении карты) вы чаще всего будете получать фамилию (или фамилии, если во входных данных было несколько раз).
// редактировать
Ниже приведен короткий фрагмент с моим решением:
Map<Integer, List<String>> map = new HashMap<>();
map.put(2,Arrays.asList("name1","name2"));
Optional<String> optionalS = map
.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey(Comparator.reverseOrder()))
.findFirst() //get max{map's keys}
.filter(x->x.getValue().size() == 1) //get lastname that occured only once
.map(x->x.getValue().get(0)); //get that lastname (above filter check that list has only one element) or Optional.empty if stream didn't find any
System.out.println(optionalS.toString());
Я пропустил часть создания карты.
P.S. Вы можете заменить HashMap на TreeMap на собственный компаратор, чтобы избежать сортировки в потоке.