1

我似乎无法弄清楚为什么我不断收到此错误!这是我第一次处理队列。我确信解决方案很简单,我可能缺少一些基本的东西。非常感谢任何指导/帮助:

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 个人,直到只剩下一个人。传说约瑟夫斯为了避免被淘汰而想出了坐在哪里。编写一个队列客户端 Josephus,它从命令行获取 N 和 M,并打印出人员被淘汰的顺序(从而显示 Josephus 在圆圈中的位置)。

4

4 回答 4

0

你有:

Queue<Integer> q = new LinkedList<Integer>();
for (int i = 0; i < n; i++)
    q.remove(new Integer(i));

为什么要从新创建的(空)队列中删除项目?尝试添加它们!

q.add(new Integer(i));
于 2014-09-04T22:45:10.907 回答
0

Java 认为您正在尝试remove(int index)在 while 循环下调用 if 语句的 else 语句,因为您传入的是 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]);
于 2014-09-04T22:46:27.723 回答
0

当您尝试访问不存在的数组元素时,将发生数组越界异常。

查看

args.length >= 2 在尝试访问该数组的前 2 个元素之前。

于 2014-09-04T22:52:08.413 回答
0

您以错误的方式调用程序...如果使用命令行,则必须提供参数:

java Josephus 5 6

否则,如果您使用 Eclipse(例如),则必须转到 Run as,Run configurations,并在 Program arguments 字段中添加一些参数。您还可以通过手动输入值替换第一行:

int n = 10, m = 5;

我用随机的 (m,n) 值集运行它,它运行时没有任何错误(但是,它没有打印任何东西)。

于 2014-09-04T22:58:01.497 回答