0

どこかで、最も小さい番号の値を削除することによってStringargs[]をステップスルーした例を見たことを思い出します。

public static void main( String args[]) {
    while (args.length > 0 ) {
    // do something and obliterate elements from args[]
    }
}

明らかに、argsの現在の位置を追跡し、args.lengthと比較して可変で実行します。または、argsAL.size()を使用してargs[]のコンテンツから作成されたArrayList。ArrayListの例を覚えていませんか?私はこれが境界的な質問であることを知っています、おそらく答えは「いいえ、ありませんし、どちらもあるべきではありません!」です。多分私は集中しすぎています...

明細書

4

7 に答える 7

5

いいえ、ありませんし、あるべきでもありません!配列の先頭から削除することは、これを行うための不必要に費用のかかる方法です。

shift次の要素(perl、bashなど)をデキュー する演算子を持つ多くのスクリプト言語を考えているかもしれません。

編集:後世のために、同じ機能を「偽造」する(つまりカーソルをカプセル化する)ことができる非常に単純なキューの実装を次に示します。

class ArrayQueue<E> extends AbstractQueue<E> {

    private int cursor = 0;
    private final E[] data;

    public ArrayQueue(E[] data) {
        this.data = data;
    }

    private boolean inRange() {
        return cursor < data.length;
    }

    @Override
    public E peek() {
        return inRange() ? data[cursor] : null;
    }

    @Override
    public E poll() {
        return inRange() ? data[cursor++] : null;
    }

    @Override
    public boolean offer(E e) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void clear() {
        cursor = data.length;
    }

    @Override
    public Iterator<E> iterator() {
        //ommitted for brevity
    }

    @Override
    public int size() {
        return data.length - cursor;
    }

}

使用法:

public static void main(String[] args) throws Exception {
    Queue<String> argQ = new ArrayQueue<String>(args);
    String command = argQ.poll();
    String target = argQ.poll();
}

警告:テストされていません

于 2010-06-16T20:29:00.393 に答える
3

本当に引数パーサーを使用する必要があります。私のお気に入りはJavaSimpleArgument Parser(JSAP)です。args[]配列を直接操作する理由はありません。私は、最も基本的なコマンドラインプログラムでもJSAPを使用しています。これは、最終的には「基本」ではなくなったためです。

于 2010-06-16T20:41:04.490 に答える
2

要素をポップオフする予定の場合は、配列全体を何度もコピーする必要があるため、配列リストを使用しないでください。代わりに、次のようにします。

public static void main(String args[]) {
    for (String arg : args) {
        // consume arg somehow
    }
}
于 2010-06-16T20:31:26.923 に答える
1

arraycopyが本当に好きな場合を除いて、forループを使用してください。

パフォーマンスの観点からも、それは問題ではありません。ほとんどのコマンドラインは32k文字を超えないので、アプリは通常、コマンドラインの16k引数に使用されるとは思いません。

于 2010-06-16T20:29:56.067 に答える
1

... ArrayListの例を覚えていませんか?..

おそらくまたは他のプログラミング言語。

それらのいくつかはshift、呼び出されたときにそれを行い、0番目の要素を与えてそれを削除するメソッドを持っています。

main( args: Array[String) {
    name = args.at(0)
    args.shift
    lastName = args.at(0)
    args.shift
}
于 2010-06-16T20:33:35.327 に答える
1

それを行うのは奇妙な方法でしょう。技術的にはより高価ですが、クレイジーな大きなコマンドラインがない限り、それは実際には考慮事項ではありません。

ループを使用することがすでに提案されており、これは間違いなく機能します。

コマンドラインオプションをより適切に制御するには、java-getoptを確認してください。

于 2010-06-16T20:33:48.660 に答える
0

おそらくを使用して、実際にリストを使用する必要がありますjava.util.Arrays.asList(args)。次に、前後の要素のトラバーサルと簡単な削除を注文しました。

于 2010-06-16T20:30:38.593 に答える