Как бы вы разбили строки из аргументов командной строки? - Java

1

В основном в командной строке мои аргументы будут чем-то вроде

-app app1 app2 app3 -env env1 env2 //the number can go higher then 3 and 2 

где у меня есть перечисление для приложений и перечисление для envs

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

и от передачи аргумента командной строки с пробелами и соединить его, но это не сработало

Я думаю, что мне нужно сделать, это раскол, когда я вижу "-app", затем добавьте, что после этого, в список, пока не увижу "-env", поэтому я хотел бы разделить на "-". Я никогда не разделял аргументы командной строки или массивы. Это то, что я пытаюсь сделать до сих пор. (Я взял часть if, потому что знаю, что часть работает и не связана с этим)

public static void main(String[] args) 
{
    boolean sawApp = false;
    boolean sawEnv = false;
    List<String> appList = new ArrayList();
    List<String> envList = new ArrayList();


    else if(args.length > 0)
    {
        for(int i = 0; i < args.length; i ++)
        {
            if(args.equals("-app"))
            {
                sawApp = true;
                String[] apps = //this is where I am stuck
            }
            else if(args.equals("-env")
            {
                sawEnv = true;
                String[] env = //this is where I am stuck
            }
        }

    }

Затем после того, как он разбирает их, ему необходимо взять их и запустить в этот метод, который у меня есть в верхней части кода

public static Application chooseAppTest(String[] args) 
    {
        Application application = null;

        switch (application)
        {
        case ACCOUNTINVENTORY:
  • 0
    @Eran Это первый раз, когда я спросил о разбиении массивов.
  • 0
    « было бы использовать библиотеки и работать с ними, но это не вариант для меня » Почему? Если вы хотите заново изобрести колесо, объясните нам причину.
Показать ещё 7 комментариев
Теги:
split
command-line-arguments

2 ответа

0
Лучший ответ

Если вы можете получить массив, помещенный в полную строку:

String args = "-app app1 app2 app3 -env ev1 env2";
String[] splitDashes = args.split("-");
List<String> appList = new ArrayList();
List<String> envList = new ArrayList();

for(String split : splitDashes){
    String[] splitSpaces = split.split(" ");
    if (splitSpaces[0].equals("app"))
    {
        for(String s : splitSpaces){
            if(!s.equals("app"))
                appList.add(s);
        }
    }
    else if(splitSpaces[0].equals("env"))
    {
        for(String s : splitSpaces){
            if(!s.equals("env"))
                envList.add(s);
        }
    }
}

Хорошо, я наконец придумал решение для этого, предполагая, что -app всегда будет первым. Это для массива String [] args:

public void DoSomething(){
    String[] args = {"-app", "app1", "app2", "app3", "app4", "app5", "-env", "env1", "env2", "env3", "env4"};
    List<String> appList = new ArrayList();
    List<String> envList = new ArrayList();

    int indexOfApp = -1;
    int indexOfEnv = -1;

    for(int i = 0; i<args.length; i++){
        if(args[i].equals("-app")){
            indexOfApp = i;
        }else if(args[i].equals("-env")){
            indexOfEnv = i;
        }
    }

    int countOfApp = -1;
    int countOfEnv = -1;

    if(indexOfApp != -1 && indexOfEnv != -1){
        countOfApp = indexOfEnv - 1;
        countOfEnv = args.length - (indexOfEnv + 1);
    }


    System.out.println(countOfApp);
    System.out.println(countOfEnv);

    for(int appIndex = indexOfApp; appIndex < countOfApp; appIndex++){
        appList.add(args[appIndex]);
    }

    for(int envIndex = indexOfEnv + 1; envIndex < args.length; envIndex++){
        envList.add(args[envIndex]);
    }


    Assert.assertEquals(5, appList.size());
    Assert.assertEquals(4, envList.size());

} 
  • 0
    Спасибо! если бы я изменил аргументы, чтобы они равнялись всему массиву, это все равно будет работать так же? Могло быть больше или меньше аргументов, поэтому я и спросил.
  • 0
    Я подумал, что app1 или env1 могут быть любыми именами, поэтому приравнивание всего массива может не совпадать, если у них разные имена.
Показать ещё 6 комментариев
5

Я бы использовал args4j. Любая попытка "правильно" проанализировать аргументы командной строки вручную - это упражнение в бесполезности и переосмыслении колес.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню