1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем iD3LSY, 9 июн 2017.

Статус темы:
Закрыта.
  1. Автор темы
    iD3LSY

    iD3LSY Активный участник Пользователь

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

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

    Будь то идея, код, не важно. Буду рад любой помощи)
     
  2. xDark

    xDark Активный участник Пользователь

    Баллы:
    96
    Тк а может не <Player, Integer>, а <Integer, Player> ?
     
  3. TheZefirrkka

    TheZefirrkka Активный участник Пользователь

    Баллы:
    76
    А смысл??
     
  4. Dexel

    Dexel Активный участник Пользователь

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

    Пришло время подсчёта голосов. Нам уже не важно, кто голосовал. Нам важно знать, какие варианты ответа получились. Проитерируем по значениям словаря votes и подсчитаем количество голосов за каждый вариант ответа:
    Код:
    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:
    Код:
    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'а — максимальное кол-во голосов и номер ответа, который набрал это кол-во:
    Код:
    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 надо использовать для того, чтобы не возникало вопросов вида "А разве был нулевой вариант ответа?".

    Поправьте, если где-то ошибся :)
     
  5. Автор темы
    iD3LSY

    iD3LSY Активный участник Пользователь

    Баллы:
    76
    Спасибо. За
    Спасибо, помог, отписал все очень подробно. Закрываю тему.
     
Статус темы:
Закрыта.

Поделиться этой страницей