Помогите Голосование. Выбор победителя.

  • Автор темы Автор темы iD3LSY
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

iD3LSY

Активный участник
Пользователь
Баллы
76
Имеется HashMap<Player, Integer> votes. У каждого игрока есть свой выбор в голосовании. Голосования создаются командой, так-что узнать, сколько будет вариантов ответа - нельзя.

Нужно просто сложить суммарное кол-во голосов от каждого игрока на каждый ответ, return номер того варианта ответа, который имеет большее кол-во.

Будь то идея, код, не важно. Буду рад любой помощи)
 
Тк а может не <Player, Integer>, а <Integer, Player> ?
 
1) ХРАНЕНИЕ ГОЛОСОВ И РЕЗУЛЬТАТОВ ГОЛОСОВАНИЯ
Варианты ответа в твоём словаре должны начинаться с нуля. То есть, вариант ответа №1 по совместительству в твоём коде будет вариантом ответа №0:
Java:
int n = Integer.parseInt(args[0]); // Вариант ответа, за который проголосовал игрок. NumberFormatException лови сам

// Различные проверки на целостность

n--;
votes.put(player, n);
Прекрасно. Мы знаем, что игрок проголосовал, например, за первый (нулевой) вариант ответа.

Пришло время подсчёта голосов. Нам уже не важно, кто голосовал. Нам важно знать, какие варианты ответа получились. Проитерируем по значениям словаря votes и подсчитаем количество голосов за каждый вариант ответа:
Java:
HashMap<Integer, Integer> results = new HashMap<>();
for (int i : votes.values()) {
    int vAmount = results.get(i); // Количество набранных прежде голосов за этот вариант ответа
    vAmount++; // Увеличиваем на 1
    results.put(i, vAmount); // Кидаем в словарь результатов
}
Неплохо. Но вдруг словарь results не будет содержать ключа i? Тогда мы или получим null в vAmount, или получим NullPointer, или ещё что. В любом случае, что-то да получим. Неплохо было бы проверять наличие ключа i в словаре results:
Java:
HashMap<Integer, Integer> results = new HashMap<>();
for (int i : votes.values()) {
    if (!(results.containsKey(i)))
        results.put(i, 1); // Мы уже нашли один голос за этот вариант ответа, смысла класть туда любое другое число нет.
    else {
        int vAmount = results.get(i); // Количество набранных прежде голосов за этот вариант ответа
        vAmount++; // Увеличиваем на 1
        results.put(i, vAmount); // Кидаем в словарь результатов
    }
}
Мы имеем словарь с результатами голосования. Наш ключ — вариант ответа, его значение в results — количество голосов за этот вариант. Если вариант ответа не набрал голосов, его нет в результатах. Ибо 0 — это не результат =P

2) НАХОЖДЕНИЕ "ПОБЕДИТЕЛЯ"
К сожалению, я проспал занятие на тему "Методы сортировки", да и на поисковых сервисах меня забанили. Поэтому буду использовать, возможно, не самый быстрый, но самый наглядный способ — метод нахождения максимального элемента в массиве. Но мы имеем дело со словарём. Значит, будем хранить два int'а — максимальное кол-во голосов и номер ответа, который набрал это кол-во:
Java:
int max = 0;
int maxn = 0;
for (int i : results.keySet()) {
    if (results.get(i) > max) {
        maxn = i;
        max = results.get(i);
    }
}
После итерации мы с уверенностью сможем сказать: "Победил вариант ответа №maxn+1, набрав max голосов". maxn+1 надо использовать для того, чтобы не возникало вопросов вида "А разве был нулевой вариант ответа?".

Поправьте, если где-то ошибся :)
 
Спасибо. За
1) ХРАНЕНИЕ ГОЛОСОВ И РЕЗУЛЬТАТОВ ГОЛОСОВАНИЯ
Варианты ответа в твоём словаре должны начинаться с нуля. То есть, вариант ответа №1 по совместительству в твоём коде будет вариантом ответа №0:
Java:
int n = Integer.parseInt(args[0]); // Вариант ответа, за который проголосовал игрок. NumberFormatException лови сам

// Различные проверки на целостность

n--;
votes.put(player, n);
Прекрасно. Мы знаем, что игрок проголосовал, например, за первый (нулевой) вариант ответа.

Пришло время подсчёта голосов. Нам уже не важно, кто голосовал. Нам важно знать, какие варианты ответа получились. Проитерируем по значениям словаря votes и подсчитаем количество голосов за каждый вариант ответа:
Java:
HashMap<Integer, Integer> results = new HashMap<>();
for (int i : votes.values()) {
    int vAmount = results.get(i); // Количество набранных прежде голосов за этот вариант ответа
    vAmount++; // Увеличиваем на 1
    results.put(i, vAmount); // Кидаем в словарь результатов
}
Неплохо. Но вдруг словарь results не будет содержать ключа i? Тогда мы или получим null в vAmount, или получим NullPointer, или ещё что. В любом случае, что-то да получим. Неплохо было бы проверять наличие ключа i в словаре results:
Java:
HashMap<Integer, Integer> results = new HashMap<>();
for (int i : votes.values()) {
    if (!(results.containsKey(i)))
        results.put(i, 1); // Мы уже нашли один голос за этот вариант ответа, смысла класть туда любое другое число нет.
    else {
        int vAmount = results.get(i); // Количество набранных прежде голосов за этот вариант ответа
        vAmount++; // Увеличиваем на 1
        results.put(i, vAmount); // Кидаем в словарь результатов
    }
}
Мы имеем словарь с результатами голосования. Наш ключ — вариант ответа, его значение в results — количество голосов за этот вариант. Если вариант ответа не набрал голосов, его нет в результатах. Ибо 0 — это не результат =P

2) НАХОЖДЕНИЕ "ПОБЕДИТЕЛЯ"
К сожалению, я проспал занятие на тему "Методы сортировки", да и на поисковых сервисах меня забанили. Поэтому буду использовать, возможно, не самый быстрый, но самый наглядный способ — метод нахождения максимального элемента в массиве. Но мы имеем дело со словарём. Значит, будем хранить два int'а — максимальное кол-во голосов и номер ответа, который набрал это кол-во:
Java:
int max = 0;
int maxn = 0;
for (int i : results.keySet()) {
    if (results.get(i) > max) {
        maxn = i;
        max = results.get(i);
    }
}
После итерации мы с уверенностью сможем сказать: "Победил вариант ответа №maxn+1, набрав max голосов". maxn+1 надо использовать для того, чтобы не возникало вопросов вида "А разве был нулевой вариант ответа?".

Поправьте, если где-то ошибся :)
Спасибо, помог, отписал все очень подробно. Закрываю тему.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх