Кажется, я не могу получить нужное количество голосов за введенное пользователем имя, и я не могу понять, как объявить победителем самое популярное имя. Я понимаю, сколько раз я голосовал за кого-то, но это не всегда правильно. Иногда я получаю ошибку исключения 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));
}
}
Если вы хотите получить более 1 голоса, вам нужно поместить свою программу в другую, пока пользователь не перестанет вставлять голоса, иначе вы получите только один голос. И если вы получаете ArrayIndexOutOfBounds, это потому, что у вас еще нет этой позиции в массиве. Возможно, потому что вы только что получили 1 голос.
Добро пожаловать в Stack Overflow. Пожалуйста, отредактируйте вопрос, включив в него весь необходимый исходный код, данные и сообщения об ошибках в виде текста. Рассмотрим эти причины и рекомендации.
Ваша структура
if (Names.contains(addName)) { // Name already in the array
...
}
if (addName.equals("-0")) {
...
break;
} else { // Name not in the array
...
}
и поэтому, несмотря на комментарий, код «имя не в массиве» выполняется для каждого имени, кроме «-0», вне зависимости от того, находится оно в массиве или нет.
Итак, вы добавляете в массив имена, которые уже есть в массиве.
Второе «если» должно быть «иначе, если».
В качестве альтернативы, если голоса не идут так, как вы хотите, вы можете подать в суд :-)
Вы используете незаконные данные для своей цели. Вы используете 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
Большое спасибо ! ЭТО было очень полезно!
Пожалуйста, объясните точную проблему, включая пример ввода, для которого она возникает, ожидаемый вывод для этого ввода и фактический вывод. Чем больше времени вы потратите на хороший вопрос, тем легче другим будет найти хороший ответ.