我似乎不明白为什么一直出现这个错误!这是我第一次处理排队问题。我确信解决方案很简单,我可能遗漏了一些基本的东西。非常感谢任何指导/帮助:
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显示圆圈中的位置)。
您调用程序的方式不对。。。如果使用命令行,则必须提供参数:
java Josephus 5 6
否则,如果使用Eclipse(例如),则必须转到Run as、Run configurations,并在Program arguments字段中添加一些参数。您还可以用手动键入的值替换第一行:
int n = 10, m = 5;
我用随机的(m,n)值集运行它,它运行时没有任何错误(然而,它没有打印任何内容)。
您有:
Queue<Integer> q = new LinkedList<Integer>();
for (int i = 0; i < n; i++)
q.remove(new Integer(i));
为什么要从新建(空)队列中删除项目?请尝试添加它们!
q.add(new Integer(i));
Java认为您正试图在while循环下的if语句的else语句中调用remove(int index)
,因为您正在传递一个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]);
当您尝试访问不存在的数组元素时,将发生数组越界异常。
检查
args.length>=2,然后尝试访问此数组的前2个元素。