0

我记得在某处看到一个示例,该示例通过删除最小编号的值来逐步执行 String args[]

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

显然,在 args 中跟踪当前位置并与 args.length 进行比较的变量会做到这一点;或由 args[] 的内容组成的 ArrayList,使用 argsAL.size()。我是否记错了 ArrayList 示例?我知道这是一个边缘问题,可能的答案是,“不,没有,也不应该有!”。可能是我太专注了...

账单

4

7 回答 7

5

不,没有,也不应该有!从数组的前面删除将是一种不必要的昂贵方法。

您可能会想到许多脚本语言都有一个shift操作符来使下一个元素出队(perl、bash 等)。

编辑:只是为了后代,这是一个非常简单的 Queue 实现,它允许您“伪造”相同的功能(即封装光标):

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

你真的应该使用参数解析器。我最喜欢的是Java Simple Argument 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

只需使用 for 循环,除非您真的喜欢 arraycopy。

从性能的角度来看,这也无关紧要,除了超过 32k 的字符外,大多数命令行都不重要,而且我认为您的应用程序通常不会用于命令行上的 16k args。

于 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 回答