Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

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

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

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

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

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

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

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    Тк а может не <Player, Integer>, а <Integer, Player> ?
     
  4. TheZefirrkka

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

    Баллы:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
    А смысл??
     
  5. Dexel

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

    Баллы:
    76
    Skype:
    the_osirius
    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 надо использовать для того, чтобы не возникало вопросов вида "А разве был нулевой вариант ответа?".

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

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

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

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