2010-06-16 1 views
0

я помню, видя, где-то, пример, который прошел через Струнные арг [], удалив с наименьшим номером значения (ов)Удалить последовательные 0-й записи в args [] для интерфейса командной строки Java?

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

Очевидно, что переменная отслеживания текущей позиции в арг и по сравнению с args.length будет делать Это; или ArrayList, созданный из содержимого args [], с argsAL.size(). Я неправильно помню пример ArrayList? Я знаю, что это пограничный вопрос, вероятный ответ: «Нет, нет и не должно быть!». Может быть, я чрезмерно сфокусировано ...

Билл

ответ

4

Нет, нет и не должно быть! Удаление из передней части массива было бы ненужным дорогостоящим способом.

Возможно, вы думаете о многих языках сценариев, имеющих оператора shift, чтобы удалить следующий элемент (perl, bash и т. Д.).

Edit: Только для потомков, здесь довольно простая реализация очереди, что позволит вам «поддельные» те же функции (т.е. инкапсулировать курсор):

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(); 
} 

Предупреждение: Непроверенные

+0

+1 Это тоже мое восприятие. – OscarRyz

+1

Кто-нибудь, дайте мне знать, почему вы отказались, поэтому я могу улучшить свой ответ. Анонимные downvotes трусливы. –

+0

Приятно, если это нужно сделать, это или цикл петли от Бена С. - путь. Спасибо, ребята! Bill –

1

Просто использовать цикл, кроме случаев, когда вы действительно любите arraycopy's.

С точки зрения исполнения, это не имеет значения, большинство команд не содержат больше, чем 32k символов, и я не думаю, что ваше приложение обычно используется для командной строки 16k в командной строке.

0

Вы должны действительно использовать Список, возможно, используя java.util.Arrays.asList(args). Затем вы заказали обход и легкое удаление передних и задних элементов.

+1

Этот метод возвращает 'ArrayList', что означает, что выскакивающие элементы с фронта вызовут массив всех остальных элементов для перемещения их в массиве. Далек от идеала. –

+0

технически это дает вам ArrayList, который имеет производительность O (n) для удаления спереди ... но массив args [] достаточно мал, чтобы производительность не имела значения. –

+1

Ack! Хороший момент, вот что я получаю от того, что не читаю документы. Мне стыдно! Я думаю, что с помощью какого-то конструктора LinkedList с массивом будет путь. –

2

Если вы планируете выскакивать элементы, не используйте список массивов, так как весь массив нужно будет скопировать несколько раз. Вместо этого, сделать что-то вроде этого:

public static void main(String args[]) { 
    for (String arg : args) { 
     // consume arg somehow 
    } 
} 
+0

Я бы предложил расширенный цикл for. Тогда вы можете игнорировать тот факт, что вы смотрите на массив. –

+0

Хорошая точка, отредактированная. –

+0

@Mark - если в вашем синтаксисе аргументов используются параметры стиля «--xx», то может быть более удобна старая школа для циклов –

1

... неправильно помнящие Am I в ArrayList пример ..

Возможно или какой-либо другой язык программирования.

Некоторые из них имеют метод shift, который при вызове делает, что дает 0-й элемент и удаляет его, что-то вроде:

main(args: Array[String) { 
    name = args.at(0) 
    args.shift 
    lastName = args.at(0) 
    args.shift 
} 
+0

Я уверен, что все. Благодарю. –

1

Было бы странным способом сделать это. Технически дороже, но если у вас нет какой-то сумасшедшей большой командной строки, это действительно даже не соображение.

Было предложено использовать цикл, и это определенно может работать.

Для лучшего управления параметрами командной строки проверьте java-getopt.

+0

Почему это было приостановлено? –

3

Вы должны действительно использовать парсер аргументов. Я предпочитаю Java Simple Argument Parser (JSAP). Невозможно напрямую манипулировать массивом args []. Я использую JSAP даже для самых простых программ командной строки, потому что в конечном итоге они не являются «базовыми».

+0

Я буду искать его. Благодарю. «базовые» программы имеют забавный способ роста ... они говорят, что вы действительно знаете организацию, как она себя ведет в условиях кризиса, но «тривиальные» и «базовые» программы, вероятно, находятся ближе всего ближе к ядру. –

Смежные вопросы