Массив за пределами исключения, Иосиф Флавий
Я не могу понять, почему я продолжаю получать эту ошибку! Я впервые имею дело с очередями. Я уверен, что решение простое, и я, вероятно, упускаю что-то основное. Любое руководство / помощь с благодарностью
import java.util.LinkedList;
import java.util.Queue;
public class Josephus{
public static void main(String[] args)
{
int n = Integer.parseInt(args[0]),
m = Integer.parseInt(args[1]);
Queue<Integer> q = new LinkedList<Integer>();
for (int i = 0; i < n; i++)
q.remove(new Integer(i));
int k = 0;
while (!q.isEmpty())
{
int x = q.remove();
if (++k % m == 0)
System.out.print(x + " ");
else
q.remove(x);
System.out.println(x + " ");
}
}
}
Исходное приглашение для этого кода выглядит следующим образом: Проблема Иосифа. В проблеме Иосифа из древности, N людей находятся в тяжелом положении и соглашаются на следующую стратегию по сокращению населения. Они упорядочивают себя по кругу (в позициях, пронумерованных от 0 до N–1) и продвигаются по кругу, устраняя каждого M-го человека, пока не останется только один человек. Легенда гласит, что Иосиф выяснил, где сидеть, чтобы не быть устраненным. Напишите клиента очереди Джозефуса, который берет N и M из командной строки и распечатывает порядок, в котором исключаются люди (и, таким образом, показывает Иосифу, где сидеть в кругу).
4 ответа
Вы неправильно вызываете свою программу... если вы используете командную строку, вы должны предоставить параметры:
java Josephus 5 6
В противном случае, если вы используете Eclipse (например), вы должны перейти к "Запуск от имени", "Запуск конфигураций" и добавить некоторые аргументы в поле "Аргументы программы". Вы также можете заменить первую строку на введенные вручную значения:
int n = 10, m = 5;
Я запустил его со случайными наборами (m,n) значений, и он запустился без каких-либо ошибок (однако, он ничего не печатал).
Исключение массива вне границ будет происходить при попытке доступа к элементу массива, который не существует.
Проверьте
args.length >= 2, прежде чем пытаться получить доступ к первым 2 элементам этого массива.
Java думает, что вы пытаетесь позвонить remove(int index)
в операторе else оператора if в цикле while, потому что вы передаете int. Как обходной путь, делайте то, что вы делали именно в цикле for.
q.remove(new Integer(x));
Также вам необходимо убедиться, что пользователь ввел правильные аргументы в командной строке.
if (args.length != 2){
System.out.println("Invalid arguments.");
return;
}
int n = Integer.parseInt(args[0]),
m = Integer.parseInt(args[1]);
У тебя есть:
Queue<Integer> q = new LinkedList<Integer>();
for (int i = 0; i < n; i++)
q.remove(new Integer(i));
Почему вы удаляете элементы из вновь созданной (пустой) очереди? Попробуйте добавить их вместо!
q.add(new Integer(i));