I can’t seem the get the right amount of votes for the user inputted name and I can’t figure out how to get the most popular name declared as the winner. I do get how many times I’ve voted for someone but it’s not always right. Sometimes I get an ArrayIndexOutOfBounds Exception error and I think it has to do something with the Candidate get and Vote get print in the end.
This is how it supposed to be.
That’s how I managed to do it so far.
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)); } }
Advertisement
Answer
You use illegal data stryctyre for your goal. You use List
, but you have to count the votes for each name. So you have to use Map<String, Integer>
where key
is the name and value
is the amount of votes.
Additionally, you have to sort these names by votes. So you could create a new list
with all entries
form this map and then sort these names by votes desc. But I prefer to use another data structure PriorityQueue
tha internally sorts the entries.
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 votesn", vote.getKey(), vote.getValue()); } System.out.println("------------------------"); System.out.format("The Winner is %s with %d votesn", winner.getKey(), winner.getValue()); } }
Demo
####################################### # 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