Разделение строки N на строки N / X - PullRequest
2 голосов
/ 09 ноября 2010

Я хотел бы получить несколько советов о том, как разбить строку на N отдельных строк на основе арифметической операции;например string.length () / 300.

Мне известны способы сделать это с помощью разделителей, таких как

testString.split(",");

, но как использовать жадные / неохотные / притяжательные квантификаторы сsplit метод?


Обновление: По запросу аналогичный пример того, чего я хочу достичь;

String X = "32028783836295C75546F7272656E745C756E742E657865000032002E002E005C0"

В результате X / 3 (больше илименьше ... сделано вручную)

X[0] = 32028783836295C75546F

X[1] = 6E745C756E742E6578650

x[2] = 65000032002E002E005C0

Не беспокойтесь об объяснении, как поместить его в массив, у меня нет проблем с этим, только о том, как разделить без использования разделителя, ноарифметическая операция

Ответы [ 5 ]

10 голосов
/ 09 ноября 2010

Вы можете сделать это, разделив (?<=\G.{5}), в результате чего строка aaaaabbbbbccccceeeeefff будет разбита на следующие части:

aaaaa
bbbbb
ccccc
eeeee
fff

\G соответствует позиции (нулевой ширины), где произошло предыдущее совпадение. Первоначально, \G начинается в начале строки. Обратите внимание, что по умолчанию метасимвол . не соответствует разрывам строк, поэтому, если вы хотите, чтобы он соответствовал каждому символу, включите DOT-ALL: (?s)(?<=\G.{5}).

Демонстрация:

class Main {
  public static void main(String[] args) {
    int N = 5;
    String text = "aaaaabbbbbccccceeeeefff";
    String[] tokens = text.split("(?<=\\G.{" + N + "})");
    for(String t : tokens) {
      System.out.println(t);
    }
  }
}

, который можно протестировать онлайн здесь: http://ideone.com/q6dVB

EDIT

Поскольку вы запросили документацию по регулярным выражениям, вот конкретные руководства по темам, которые содержит предлагаемое регулярное выражение:

4 голосов
/ 09 ноября 2010

Если есть фиксированная длина, которую вы хотите, чтобы каждая String была, вы можете использовать Гуава Splitter :

int length = string.length() / 300;
Iterable<String> splitStrings = Splitter.fixedLength(length).split(string);

Каждый String в splitStrings с возможным исключением последнего будет иметь длину length.Последний может иметь длину от 1 до length.

Обратите внимание, что в отличие от String.split, который сначала строит ArrayList<String>, а затем использует toArray() для этого, чтобы получить окончательный результат String[],Splitter в Гуаве ленив и ничего не делает со строкой ввода, когда вызывается split.Фактическое разбиение и возврат строк выполняется по мере того, как вы перебираете получившийся Iterable.Это позволяет вам просто перебирать результаты, не выделяя структуру данных и не сохраняя их все, или копировать их в любой тип Collection, который вы хотите, без прохождения промежуточных ArrayList и String[].В зависимости от того, что вы хотите сделать с результатами, это может быть значительно более эффективным.Также намного более понятно, что вы делаете, чем с помощью регулярных выражений.

2 голосов
/ 09 ноября 2010

Как насчет простой старой String.substring? Он дружествен к памяти (так как он использует оригинальный массив символов).

1 голос
/ 09 ноября 2010

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

int N=300;
int sublen = testString.length()/N;
String[] subs = new String[N];
for(int i=0; i<testString.length(); i+=sublen){
  subs[i] = testString.substring(i,i+sublen);
}

Вы можете сделать это быстрее, если вам нужны элементы в виде массива char[], а не индивидуально Strings - в зависимости от того, как вам нужно использовать результаты - например, используя testString.toCharArray()

1 голос
/ 09 ноября 2010

Не знаю, вам, вероятно, понадобится метод, который принимает строку и int раз и возвращает список строк. Псевдокод (еще не проверял, работает он или нет):

public String[] splintInto(String splitString, int parts)
{
   int dlength = splitString.length/parts
   ArrayList<String> retVal = new ArrayList<String>()
   for(i=0; i<splitString.length;i+=dlength)
   {
      retVal.add(splitString.substring(i,i+dlength)

   }
   return retVal.toArray()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...