2014-10-08 2 views
0

У меня есть строкаМожно ли разбить строку Java назад?

Product Description ID1 ID2 QTY Rate1 Rate2 

Я хочу сделать перерыв как

Product Description|ID1|ID2|QTY|Rate1|Rate2 

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

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

+2

Ваш подход кажется мне разумным, но вы могли бы показать код. – clcto

+0

Точно так же, как ответ @ Robert3452. – raka

ответ

2

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

Одним из способов будет выглядеть следующим образом:

  1. сделать первоначальный проход, используя Matcher.find(int) найти положение «N - 5-й» разделитель. (Это требует int[] с 5 элементов, которые вы используете в качестве своего рода очереди смещений, определенных с помощью find.)

  2. использования String.substring раньше извлечь строки и после этого сепаратора

  3. использование String.split расколоть Вторая подстрока, чтобы отделить последние 5 полей.

Если вы сохранили смещения и длины соответствия (от шага # 1) вы могли бы заменить split вызов на этапе № 3 с петлей и substring вызовов.


(Причина вы не можете вообще раскола «назад» в том, что регулярные выражения не могут быть согласованы в обратном направлении. Точнее, если вы сделали, что вы могли бы в конечном итоге расщепление по-другому, когда вы сделали это «вперед» Это делает нетривиальным, чтобы не делать 2 прохода. Очевидно, что в вашем конкретном случае регулярное выражение разделителя будет «одно-или более-белым», которое будет работать в обоих направлениях ... если бы была возможность сделать это в API-интерфейсе Matcher.).

-1

Обратный, строка.

Parse/Split на основе пространства.

Отмените все слова, когда вы вытаскиваете их из коллекции разобранных/разделенных слов.

Не очень элегантный, но он должен работать.

2

Разделить его на массив как обычно В итоге вы получите массив с n + 5 компонентами, где n - количество слов в описании продукта.

Тогда вы знаете:

Rate2 = arr[len-1] 
Rate1 = arr[len-2] 
QTY = arr[len-3] 
ID2 = arr[len-4] 
ID3 = arr[len-5] 

Затем объединить элементы обр [0] для обр [Len-6] добавление пробела между ними. Это дает вам описание вашего продукта.

В качестве альтернативы можно использовать Collections.reverse() на выходном массиве, но оба метода получить тот же результат

1

Использование StringBuilder, это, вероятно, как компактный, как вы можете получить. Хорошо, что вам не нужно жонглировать множеством индексов. На самом деле вам не нужно жонглировать любым.

String foo = "Product Description Test Potato ID1 ID2 QTY Rate1 Rate2 "; 
    foo = foo.trim(); // get rid of any extra spaces, in case we have any, as a safety check 

    //the code that does your work 
    StringBuilder bar = new StringBuilder(foo); 
    // we have to add the pipe 5 times 
    for (int i = 5; i > 0; i--) { 
     bar.setCharAt(bar.lastIndexOf(" "), '|'); 
    } 
    foo = bar.toString(); 
1
// Product Description ID1 ID2 QTY Rate1 Rate2 
    // Product Description|ID1|ID2|QTY|Rate1|Rate2 

    String actWord = "Product it a middle data Description ID1 ID2 QTY Rate1 Rate2"; 
    String outputWord = null; 
    String[] arr = actWord.split(" "); 

    StringBuffer buf = new StringBuffer(); 
    for (int i = 0; i < arr.length; i++) { 
     System.out.println(arr[i] + "=" + (i < arr.length - 5)); 
     if (i < arr.length - 5) { 
      buf.append(arr[i] + " "); 

     } else 
      buf.append("|" + arr[i]); 
    } 
    System.out.println("output - " + buf.toString().trim()); 

Я надеюсь, что это решает вашу проблему.

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