Как узнать голоса пользователей и код победителя выборов?

Кажется, я не могу получить нужное количество голосов за введенное пользователем имя, и я не могу понять, как объявить победителем самое популярное имя. Я понимаю, сколько раз я голосовал за кого-то, но это не всегда правильно. Иногда я получаю ошибку исключения ArrayIndexOutOfBounds Exception, и я думаю, что это должно что-то делать с получением кандидата и получением голосования в конце.

Вот как это должно быть.

Как узнать голоса пользователей и код победителя выборов?

Вот как мне удалось это сделать до сих пор.

Как узнать голоса пользователей и код победителя выборов?

public class JavaApplication16 {

    public static void main(String[] args) {


        ArrayList<String> Names = new ArrayList<String>();

        ArrayList<Integer> Votes = new ArrayList<Integer>();
        Scanner input = new Scanner(System.in);

        System.out.println("Enter the name you wish to vote for: ");
        String addName = input.nextLine();

        while (addName.length() != 0) {
            if (Names.contains(addName)) { // Name already in the array
                int i = Names.indexOf(addName); // Add some code to find the index of the name in the Names array
                Integer j = Votes.get(i);   // Find out how many votes they currently have
                j++;    // Increment it by 1
                Votes.set(i, j); // Put the new number of votes back into the Votes array at the correct index
                //Votes.indexOf(addName);// Increment the contents of the Votes array at the same index

                //break;
            }
            if (addName.equals("-0")) {
                System.out.println("List of the Candidates");
                break;

            } else { // Name not in the array
                Names.add(addName); // Add the name to the end of the list
                Votes.add(1); // They have one vote so far, so set their vote count to 1
            }

            addName = input.nextLine();

        }
        //End of the while loop to vote

        //A List to remove the duplicates from the Name list
        ArrayList<String> Candidate = new ArrayList<String>();
        for (String nam : Names) {
            if (!Candidate.contains(nam)) {
                Candidate.add(nam);
            }
        }

        for (int t = 0; t < Candidate.size(); t++) {

        }
        for (int i = 0; i < Names.size(); i++) {

        }
        for (int j = 0; j < Votes.size(); j++) {

        }  // The following is a basic example - you could use a for loop and make the output look better

        System.out.println(Candidate.get(0) + " recieved " + (Votes.get(0) + " vote. "));
        System.out.println(Candidate.get(1) + " recieved " + (Votes.get(1) + " vote. "));
        System.out.println(Candidate.get(2) + " recieved " + (Votes.get(2) + " vote. "));
        System.out.println(Candidate.get(3) + " recieved " + (Votes.get(3) + " vote. "));


        // Code to find out the highest amount of votes
        System.out.println("AND THE WINNER IS");
        System.out.println(Collections.max(Names));
        System.out.println(Collections.max(Votes));

    }
}

Пожалуйста, объясните точную проблему, включая пример ввода, для которого она возникает, ожидаемый вывод для этого ввода и фактический вывод. Чем больше времени вы потратите на хороший вопрос, тем легче другим будет найти хороший ответ.

tucuxi 13.12.2020 20:37

Если вы хотите получить более 1 голоса, вам нужно поместить свою программу в другую, пока пользователь не перестанет вставлять голоса, иначе вы получите только один голос. И если вы получаете ArrayIndexOutOfBounds, это потому, что у вас еще нет этой позиции в массиве. Возможно, потому что вы только что получили 1 голос.

MadMax 13.12.2020 20:39

Добро пожаловать в Stack Overflow. Пожалуйста, отредактируйте вопрос, включив в него весь необходимый исходный код, данные и сообщения об ошибках в виде текста. Рассмотрим эти причины и рекомендации.

bad_coder 13.12.2020 21:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
685
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваша структура

       if (Names.contains(addName)) { // Name already in the array
           ...
       }
       if (addName.equals("-0")) {
            ...
            break;
       } else { // Name not in the array
            ...
       }

и поэтому, несмотря на комментарий, код «имя не в массиве» выполняется для каждого имени, кроме «-0», вне зависимости от того, находится оно в массиве или нет.

Итак, вы добавляете в массив имена, которые уже есть в массиве.

Второе «если» должно быть «иначе, если».

В качестве альтернативы, если голоса не идут так, как вы хотите, вы можете подать в суд :-)

a guest 13.12.2020 21:27
Ответ принят как подходящий

Вы используете незаконные данные для своей цели. Вы используете List, но вам нужно подсчитать голоса за каждое имя. Поэтому вам нужно использовать Map<String, Integer>, где key — имя, а value — количество голосов.

Кроме того, вы должны отсортировать эти имена по голосам. Таким образом, вы можете создать новый list со всеми entries из этой карты, а затем отсортировать эти имена по числу голосов по убыванию. Но я предпочитаю использовать другую структуру данных PriorityQueue, которая внутренне сортирует записи.

public static void main(String... args) {
    System.out.println("#######################################");
    System.out.println("# Enter the votes, one vote per line. #");
    System.out.println("# End with either -1 or an empty line.#");
    System.out.println("#######################################");
    System.out.println();

    Scanner scan = new Scanner(System.in);
    Map<String, Integer> votes = new HashMap<>();

    while (true) {
        String name = scan.nextLine().trim();

        if (name.isEmpty() || "-1".equals(name))
            break;

        votes.put(name, votes.getOrDefault(name, 0) + 1);
    }

    if (votes.isEmpty())
        System.out.println("No Votes.");
    else {
        final Comparator<Map.Entry<String, Integer>> sortByVotesDesc = (one, two) -> Integer.compare(two.getValue(), one.getValue());
        Queue<Map.Entry<String, Integer>> queue = new PriorityQueue<>(sortByVotesDesc);
        queue.addAll(votes.entrySet());

        Map.Entry<String, Integer> winner = queue.element();

        while (!queue.isEmpty()) {
            Map.Entry<String, Integer> vote = queue.remove();
            System.out.format("%s received %d votes\n", vote.getKey(), vote.getValue());
        }

        System.out.println("------------------------");
        System.out.format("The Winner is %s with %d votes\n", winner.getKey(), winner.getValue());
    }
}

Демо

#######################################
# Enter the votes, one vote per line. #
# End with either -1 or an empty line.#
#######################################

Sam
Peter
James
Sam
Sam
Peter
Sam

Sam received 4 votes
Peter received 2 votes
James received 1 votes
------------------------
The Winner is Sam with 4 votes

Большое спасибо ! ЭТО было очень полезно!

Lyubomir Ivailov Markov 13.12.2020 21:58

Другие вопросы по теме