Вы можете либо использовать итератор прямо так, как вы упомянули, либо сохранить вторую коллекцию и добавить каждый элемент, который хотите удалить, в новую коллекцию, а затем удалить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);
}
Я не знаю ни о каких зарегистрированных "шаблонах" для обработки.
я полагаю, что одна из старейших библиотек/API для обработки аргументов является getopt. Гугление "getopt" показывает много страниц справочника и ссылок на реализации.
Обычно у меня есть предпочтения или сервис настроек в моем приложении, которое знает процессор аргумента, как связаться с. Аргументы тогда переводятся во что-то в этом сервисе, который тогда запрашивает приложение, чем. Это могло быть столь же просто как словарь настроек (как строка, устанавливающая названный "именем файла").
Я как очень не интересуюсь библиотеками, хотя это определенно полезно. Я больше искал некоторый "псевдо код", который иллюстрирует, что обработка говорит Ваш средний набор флагов и набор более длинных споров как пример.
Стандартный дизайн обычно следует за тем, что делает getopt, существуют getopt библиотеки для многих языков.NET, Python, C, Perl, PHP, и т.д.
, базовая конструкция должна иметь синтаксический анализатор командной строки, который возвращает часть частью, которую аргументы передали, чтобы быть проверенными в цикле.
Этот статья обсуждает его еще в некоторых деталях.
Я использую Getopts:: станд. и Getopts:: долго в жемчуге и также Getopt функционируют в C. Это стандартизирует парсинг и формат параметров. Другие языки имеют различные механизмы для обработки их.
Hope это помогает
Вы не упоминаете язык для этого, но если Вы ищете действительно хорошую обертку Objective C вокруг getopt тогда, платформа Dave Dribin DDCLI действительно хороша.
Getopt является единственным способом пойти.
Я пою в припеве на ответе ANTLR mes5k. Этот ссылка на Codeproject для статьи, которая обсуждает ANLTR и использование шаблона посещения для реализации мер, которые Вы хотите, чтобы Вы приложение приняли. Это правильно написано и стоит рассмотреть.
Я рекомендовал бы пользоваться библиотекой процессора командной строки. Некоторый российский парень создал достойный, но существуют тонны их там. Сэкономит Вам некоторое время, таким образом, можно сконцентрироваться на цели приложения вместо того, чтобы анализировать переключатели командной строки!
Принятие Вас имеет объект "конфигурации", который Вы стремитесь устанавливать с флагами и подходящим синтаксическим анализатором командной строки, который заботится о парсинге командной строки, и предоставьте постоянный поток опций, здесь идет блок псевдокода
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;
}
}
Эти повышение:: библиотека program_options хороша, если Вы находитесь в C++ и имеете роскошь использования Повышения.
Несколько комментариев к этому...
Первый, в то время как нет никаких шаблонов по сути, пишущий синтаксический анализатор, по существу механическое осуществление, так как дали грамматика, синтаксический анализатор может быть легко сгенерирован. Инструменты как Бизон и ANTLR приходят на ум.
Однако парсеры-генераторы обычно являются излишеством для командной строки. Таким образом, обычный шаблон должен записать тот самостоятельно (как другие продемонстрировали), несколько раз, пока Вы не устаете от контакта с утомительной деталью и находите, что библиотека делает это для Вас.
я записал один для C++, который сохраняет набор усилия, что getopt передает и делает хорошее использование шаблонов: TCLAP
Вы не упоминали язык, но для Java мы любили Apache Commons CLI . Для C/C++, getopt.
Я предпочитаю опции как "-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);
}