Заполнение пустого массива значениями HashMap
Всем доброго времени суток! В качестве обучения пишу программку для подсчета голосов.
Вот код:
public class Kata_7_3 {
public static String getWinner(final List<String> listOfBallots) {
//Your code
int votesGiven = listOfBallots.size();// Кол-во проголосовавших
String winnerName = "";
ArrayList<String> uniqueNamesOfCandidates = candidates(listOfBallots); // Получение списка уникальных имен
HashMap<String,Integer> resultOfVote = new HashMap<>();// Мапа с кандидатами и голосами
for(String name : uniqueNamesOfCandidates){
int votes = 0;
for (int j = 0;j< listOfBallots.size();j++){
if(Objects.equals(name, listOfBallots.get(j))){
votes++;
}
resultOfVote.put(name,votes);
}
}
int [] valVotes = new int[resultOfVote.size()];
for (HashMap.Entry<String,Integer> entry : resultOfVote.entrySet()){
Arrays.fill(valVotes, entry.getValue());
}
System.out.println(Arrays.toString(valVotes));
return winnerName;
}
/**
* Метод получает на вход параметр List ballots, и возвращает список уникальных кандидатов
* @param ballots Бюллетени. Список, где указаны кандидаты. Сколько раз указан кандидат в списке,
* столько за него отдано голосов
* @return возвращает ArrayList кандидатов
*/
public static ArrayList<String> candidates (List<String>ballots){
Set<String> candidates = new HashSet<>(ballots);
ArrayList<String> listOfNamesOfCandidates = new ArrayList<>(candidates);
return listOfNamesOfCandidates;
}
}
Логика этого кода такая:
На входе получаем список такого формата: "A", "A", "A", "B", "B", "B","Safa","C","C","C","C","C","C"
Потом в методе candidates получаем список просто кандидатов
За тем, создаем мапу с именем и количеством голосов
А вот дальше мне надо посчитать кто же победил. Я думал вывести значения в массив и там уже сделать подсчеты в массиве, а потом по поиску ключ-значения вывести победителя.
Это я пытаюсь сделать тут:
int [] valVotes = new int[resultOfVote.size()];
for (HashMap.Entry<String,Integer> entry : resultOfVote.entrySet()){
Arrays.fill(valVotes, entry.getValue());
}
System.out.println(Arrays.toString(valVotes));
return winnerName;
Но, в массив добавляется кол-во голосов только одного, последнего кандидата в мапе
Вот так получается: [1, 1, 1, 1]
Подскажите, как мне заполнить массив значениями из мапы таким образом, чтобы значения соответствовали каждому кандидату. По типу: [4, 7, 1, 5]
Ответы (1 шт):
Мне кажется со стримами немного красивее выходит. Правда тут есть недостаток, если будет 2 и более кандидаты с одинаковым количеством голосов, то выдаст первого. Но ты можешь и сам подумать как это исправить, либо может быть ты так и задумывал)
public static void main(String[] args) {
{
String name = getName(List.of("A", "A","A","A", "A", "B", "B", "B","Safa","C","C","C","C","C","C"));
}
}
private static String getName(List<String> list) {
return list.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.max(Map.Entry.comparingByValue())
.orElseThrow(() -> new RuntimeException("Нет кандидатов"))
.getKey();
}
Либо если не хочешь использовать стримы, то аналогичное решение без них
private static String getName(List<String> list) {
if(list.isEmpty()) throw new RuntimeException("Нет кандидатов");
Map<String, Long> map = new HashMap<>();
for (String s : list) {
map.merge(s, 1L, Long::sum);
}
return Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();
}