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 + " ");
    }
    }
}

このコードの元のプロンプトは次のとおりです。 Josephus 問題。古代からのヨセフス問題では、N 人は窮地に立たされており、人口を減らすための次の戦略に同意しています。彼らは円を描いて (0 から N-1 までの番号が付けられた位置に) 配置され、円の周りを進み、1 人だけになるまで M 番目の人を排除します。伝説によると、ヨセフスは排除されるのを避けるためにどこに座るかを考え出しました。コマンド ラインから N と M を取得し、人々が排除される順序を出力する Queue クライアント Josephus を作成します (したがって、Josefus がサークル内のどこに座るかを示します)。

4

4 に答える 4

0

プログラムを間違った方法で呼び出しています...コマンドラインを使用する場合は、パラメーターを指定する必要があります:

java Josephus 5 6

それ以外の場合は、Eclipse を使用する場合 (たとえば)、[実行]、[実行構成] に移動し、[プログラムの引数] フィールドにいくつかの引数を追加する必要があります。最初の行を手動で入力した値に置き換えることもできます:

int n = 10, m = 5;

(m、n)値のランダムなセットで実行しましたが、エラーなしで実行されました(ただし、何も出力されませんでした)。

于 2014-09-04T22:58:01.497 に答える
0

remove(int index)Java は、int を渡しているため、while ループの下の if ステートメントの else ステートメントを呼び出そうとしていると見なします。回避策として、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

存在しない配列の要素にアクセスしようとすると、配列範囲外の例外が発生します。

小切手

この配列の最初の 2 つの要素にアクセスしようとする前に、args.length >= 2。

于 2014-09-04T22:52:08.413 に答える
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 に答える