Массив за пределами исключения, Иосиф Флавий

Я не могу понять, почему я продолжаю получать эту ошибку! Я впервые имею дело с очередями. Я уверен, что решение простое, и я, вероятно, упускаю что-то основное. Любое руководство / помощь с благодарностью

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));
Другие вопросы по тегам