Каков шаблон разработки для обработки параметров командной строки

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

public static void main(String[] args)
{
    Collection<Integer> l = new ArrayList<Integer>();
    Collection<Integer> itemsToRemove = new ArrayList<Integer>();
    for (int i=0; i < 10; ++i) {
    l.add(new Integer(4));
    l.add(new Integer(5));
    l.add(new Integer(6));
    }
    for (Integer i : l)
    {
        if (i.intValue() == 5)
            itemsToRemove.add(i);
    }

    l.removeAll(itemsToRemove);
    System.out.println(l);
}
46
задан Rinke 11 March 2019 в 14:34
поделиться

13 ответов

Я не знаю ни о каких зарегистрированных "шаблонах" для обработки.

я полагаю, что одна из старейших библиотек/API для обработки аргументов является getopt. Гугление "getopt" показывает много страниц справочника и ссылок на реализации.

Обычно у меня есть предпочтения или сервис настроек в моем приложении, которое знает процессор аргумента, как связаться с. Аргументы тогда переводятся во что-то в этом сервисе, который тогда запрашивает приложение, чем. Это могло быть столь же просто как словарь настроек (как строка, устанавливающая названный "именем файла").

14
ответ дан Peter Ritchie 26 November 2019 в 20:39
поделиться

Я как очень не интересуюсь библиотеками, хотя это определенно полезно. Я больше искал некоторый "псевдо код", который иллюстрирует, что обработка говорит Ваш средний набор флагов и набор более длинных споров как пример.

-1
ответ дан Sam McAfee 26 November 2019 в 20:39
поделиться

Стандартный дизайн обычно следует за тем, что делает getopt, существуют getopt библиотеки для многих языков.NET, Python, C, Perl, PHP, и т.д.

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

Этот статья обсуждает его еще в некоторых деталях.

0
ответ дан Vinko Vrsalovic 26 November 2019 в 20:39
поделиться

Я использую Getopts:: станд. и Getopts:: долго в жемчуге и также Getopt функционируют в C. Это стандартизирует парсинг и формат параметров. Другие языки имеют различные механизмы для обработки их.

Hope это помогает

0
ответ дан Xetius 26 November 2019 в 20:39
поделиться

Вы не упоминаете язык для этого, но если Вы ищете действительно хорошую обертку Objective C вокруг getopt тогда, платформа Dave Dribin DDCLI действительно хороша.

http://www.dribin.org/dave/blog/archives/2008/04/29/ddcli

0
ответ дан Dave Verwer 26 November 2019 в 20:39
поделиться

Getopt является единственным способом пойти.

http://sourceforge.net/projects/csharpoptparse

1
ответ дан cfeduke 26 November 2019 в 20:39
поделиться

Я пою в припеве на ответе ANTLR mes5k. Этот ссылка на Codeproject для статьи, которая обсуждает ANLTR и использование шаблона посещения для реализации мер, которые Вы хотите, чтобы Вы приложение приняли. Это правильно написано и стоит рассмотреть.

2
ответ дан David Robbins 26 November 2019 в 20:39
поделиться

Я рекомендовал бы пользоваться библиотекой процессора командной строки. Некоторый российский парень создал достойный, но существуют тонны их там. Сэкономит Вам некоторое время, таким образом, можно сконцентрироваться на цели приложения вместо того, чтобы анализировать переключатели командной строки!

1
ответ дан Kilhoffer 26 November 2019 в 20:39
поделиться

Принятие Вас имеет объект "конфигурации", который Вы стремитесь устанавливать с флагами и подходящим синтаксическим анализатором командной строки, который заботится о парсинге командной строки, и предоставьте постоянный поток опций, здесь идет блок псевдокода

while (current_argument = cli_parser_next()) {
    switch(current_argument) {
        case "f": //Parser strips the dashes
        case "force":
            config->force = true;
            break;
        case "d":
        case "delete":
            config->delete = true;
            break;
        //So on and so forth
        default:
            printUsage();
            exit;
    }
}
2
ответ дан Vinko Vrsalovic 26 November 2019 в 20:39
поделиться

Эти повышение:: библиотека program_options хороша, если Вы находитесь в C++ и имеете роскошь использования Повышения.

2
ответ дан argv0 26 November 2019 в 20:39
поделиться

Несколько комментариев к этому...

Первый, в то время как нет никаких шаблонов по сути, пишущий синтаксический анализатор, по существу механическое осуществление, так как дали грамматика, синтаксический анализатор может быть легко сгенерирован. Инструменты как Бизон и ANTLR приходят на ум.

Однако парсеры-генераторы обычно являются излишеством для командной строки. Таким образом, обычный шаблон должен записать тот самостоятельно (как другие продемонстрировали), несколько раз, пока Вы не устаете от контакта с утомительной деталью и находите, что библиотека делает это для Вас.

я записал один для C++, который сохраняет набор усилия, что getopt передает и делает хорошее использование шаблонов: TCLAP

4
ответ дан Sean 26 November 2019 в 20:39
поделиться

Вы не упоминали язык, но для Java мы любили Apache Commons CLI . Для C/C++, getopt.

5
ответ дан Jason Cohen 26 November 2019 в 20:39
поделиться

Я предпочитаю опции как "-t текст" и "-i 44"; мне не нравится "-fname" или "-very-long-argument=some_value".

И "-?", "-h", и "/h" все производят экран справки.

Вот то, как мой код смотрит:

int main (int argc, char *argv[])
   {  int i;
      char *Arg;
      int ParamX, ParamY;
      char *Text, *Primary;

   // Initialize...
   ParamX = 1;
   ParamY = 0;
   Text = NULL;
   Primary = NULL;

   // For each argument...
   for (i = 0; i < argc; i++)
      {
      // Get the next argument and see what it is
      Arg = argv[i];
      switch (Arg[0])
         {
         case '-':
         case '/':
            // It's an argument; which one?
            switch (Arg[1])
               {
               case '?':
               case 'h':
               case 'H':
                  // A cry for help
                  printf ("Usage:  whatever...\n\n");
                  return (0);
                  break;

               case 't':
               case 'T':
                  // Param T requires a value; is it there?
                  i++;
                  if (i >= argc)
                     {
                     printf ("Error:  missing value after '%s'.\n\n", Arg);
                     return (1);
                     }

                  // Just remember this
                  Text = Arg;

                  break;

               case 'x':
               case 'X':
                  // Param X requires a value; is it there?
                  i++;
                  if (i >= argc)
                     {
                     printf ("Error:  missing value after '%s'.\n\n", Arg);
                     return (1);
                     }

                  // The value is there; get it and convert it to an int (1..10)
                  Arg = argv[i];
                  ParamX = atoi (Arg);
                  if ((ParamX == 0) || (ParamX > 10))
                     {
                     printf ("Error:  invalid value for '%s'; must be between 1 and 10.\n\n", Arg);
                     return (1);
                     }

                  break;

               case 'y':
               case 'Y':
                  // Param Y doesn't expect a value after it
                  ParamY = 1;
                  break;

               default:
                  // Unexpected argument
                  printf ("Error:  unexpected parameter '%s'; type 'command -?' for help.\n\n", Arg);
                  return (1);
                  break;
               }

            break;

         default:
            // It's not a switch that begins with '-' or '/', so it's the primary option
            Primary = Arg;

            break;
         }
      }

   // Done
   return (0);
   }
2
ответ дан Martin Del Vecchio 26 November 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: