2015-02-16 2 views
0

Мне очень жаль мой английский, но в любом случае: У меня массивный, например "[arg1," start, of, text, in, quotes ", arg2]" из команды "somecommand arg1 «начало текста в кавычках». Я получаю splittted строку пробелов, но это неверно. Я хочу сделать все, что от котировок в одной позиции в массиве:Перемещение и фиксация массива

  • Дано: arg1 «начало текста в кавычках» арг2
  • Перед: [arg1, «начало, из, текст, в котировках», арг2]
  • После: [arg1, «начало текста в кавычках», арг2]

И он должен работать не только с одной двойной кавычки. Там мой код:

public static String[] fixArguments(String[] arr) { 
     String[] rarr = new String[arr.length]; 
     System.out.println("==========================="); 
     System.out.println("fixArguments|arr:"+Arrays.toString(arr)); 
     System.out.println("fixArguments|rarr:"+Arrays.toString(rarr)); 
     /*for(int i=0; i<arr.length; i++) { 
      if(i < start) rarr[i] = arr[i]; 
      else if(i > end) rarr[i] = arr[i-(end-start)]; 
      else { 
       rarr[i] = StringUtils.join(Arrays.copyOfRange(arr, start, end), " "); 
      } 
     }*/ 

     int start = -1; 
     int end = -1; 
     int lastnull = -1; 
     for(int i=0; i<arr.length; i++) { 
      if(rarr[i] == null && lastnull == -1) lastnull = i; 
      System.out.println("fixArguments|for:"+i+"|start:"+start); 
      System.out.println("fixArguments|for:"+i+"|end:"+end); 
      System.out.println("fixArguments|for:"+i+"|arr[i]:"+arr[i]); 
      if((arr[i].equalsIgnoreCase("\"") || arr[i].startsWith("\"")) && start == -1) start = i; 
      else if((arr[i].equalsIgnoreCase("\"") || arr[i].endsWith("\"")) && start != -1) { 
       rarr[start] = StringUtils.join(Arrays.copyOfRange(arr, start, i+start), " "); 
       System.out.println(Arrays.asList(arr)); 
       System.out.println(i); 
       System.out.println(Arrays.asList(Arrays.copyOfRange(arr, start, i+start))); 
       System.out.println(arr[i]); 

       rarr[start] = rarr[start].substring(1, rarr[start].length()-1); 
       System.out.println("fixArguments|for:"+i+"|rar[start]"+rarr[start]); 
       start = -1; 
       end = i; 
      } else { 
       rarr[start+1] = arr[end+1]; 
       System.out.println(rarr[start+1]); 
       lastnull = -1; 
      } 
     } 
     System.out.println("================================="); 
     return rarr; 
    } 
+0

У вас есть формуи. Может быть, вы можете указать пример ввода и какой будет ваш желаемый результат? Чтобы полностью понять это требование. – Kartic

+0

Итак, учитывая массив, такой как: '[foo, bar," foo, bar "]', вы хотите получить следующий массив: '[foo, bar," foobar "]'? – npinti

+0

Думаю, я понимаю вопрос ... Пользователь передает в командной строке следующее: arg1 «somethingA somethingB somethingC» arg2. @ alex-wells хочет получить в конце arg1, arg2 и все внутри двойных кавычек в другой переменной, но, очевидно, он получает вещи внутри двойных кавычек, разделенных в разных положениях arg. Правильно? – vianna77

ответ

0

Это проще в наше время, чтобы манипулировать List сек, чем массивы, так что я вставил преобразование механизма. Вы можете использовать форму List.

public static List<String> fixArguments(List<String> args) { 
    List<String> fixed = new ArrayList<>(); 
    StringBuilder building = new StringBuilder(); 
    boolean build = false; 
    for (String arg : args) { 
     // A " at the start switches to building. 
     if (arg.charAt(0) == '\"') { 
      build = true; 
      building.setLength(0); 
     } 
     if (build) { 
      if (building.length() > 0) { 
       building.append(" "); 
      } 
      building.append(arg); 
     } else { 
      fixed.add(arg); 
     } 
     // A " at the end stops the building. 
     if (arg.charAt(arg.length() - 1) == '\"') { 
      fixed.add(building.toString()); 
      build = false; 
     } 
    } 
    return fixed; 
} 

public static String[] fixArguments(String[] arguments) { 
    // Roll the array into a List 
    List<String> args = Arrays.asList(arguments); 
    List<String> fixed = fixArguments(args); 
    String[] results = new String[fixed.size()]; 
    // Roll out the results back into an array. 
    for (int i = 0; i < results.length; i++) { 
     results[i] = fixed.get(i); 
    } 
    return results; 
} 

public void test() { 
    String[] arguments = new String[]{"One", "\"Two,", "Three,", "Four\"", "Five"}; 
    String[] fixed = fixArguments(arguments); 
    System.out.println("Before: " + Arrays.asList(arguments)); 
    System.out.println("After : " + Arrays.asList(fixed)); 
} 
+0

Хм, ты так много =) –

+0

да, это работает. Но: если я войду в космос - авария (уже исправлена). Но если я вхожу что-то вроде «command arg1» <- есть место за кавычками, и есть тоже -> «" Я получаю индекс из привязки там: if (arg.charAt (arg.length() - 1) == '\ "') { \t fixed.add (. building.toString() подстрока (1, building.length() - 1)); \t билд = ложь; \t} –

+0

@AlexWells - Да там некоторые случаи кросс, с которыми я не справляюсь - вам нужно немного отполировать. Это, однако, не устраняет реальной проблемы, что ваш разделитель командной строки плохо работает. – OldCurmudgeon

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