текстовая область-текст-для-разделения-с-условиями повторяется

У меня есть текстовая область, в которой я ограничил пользователя от ввода более 15 символов в одну строку, так как я хочу, чтобы текст свободного потока был разделен на подстроки с максимальным ограничением 15 символов и присвоил каждой строке номер заказа. Это то, что я делал в своем классе Java:

int interval = 15;                
items = new ArrayList();
 TextItem item = null;
 for (int i = 0; i < text.length(); i = i + interval) {
  item = new TextItem ();
  item.setOrder(i);

  if (i + interval < text.length()) {
    item.setSubText(text.substring(i, i + interval));
    items.add(item);
  } 
  else {
    item.setSubText(text.substring(i));
    items.add(item);
  }
}

Теперь он работает правильно, пока пользователь не нажмет клавишу ввода. Всякий раз, когда пользователь нажимает клавишу ввода, я хочу сделать эту строку новым элементом, имеющим только эту часть в качестве подтекста.

Я могу проверить, содержит ли мой text.substring(i, i + interval) какой-либо "\n", и разделить его до этого места, но проблема состоит в том, чтобы получить оставшиеся символы после "\n" до следующих 15 или до следующего "\n" и установить правильный порядок и подтекст.


person desmiserables    schedule 21.06.2009    source источник
comment
Пожалуйста, добавьте информацию о языке/инструментах в вопрос и теги. например c#, winforms, textbox или adobe, air, textbox   -  person shahkalpeshp    schedule 21.06.2009


Ответы (2)


Вы можете изменить порядок действий: во-первых, разделите содержимое вашей текстовой области на вхождения '\n'. Затем возьмите каждую из полученных строк и разделите их на части максимальной длины 15.

Редактировать: я не совсем уверен в том, что вы хотите сделать, но вот что я бы сделал. Обратите внимание, что я не программист на Java, поэтому я могу делать ложные предположения, и следующее не проверено.

int interval = 15;                
items = new ArrayList();
lines = text.split("\n");
for (int i = 0; i < lines.length(); i++)
{
  str = lines[i];
  while (str.length() > interval)
  {
    items.add(str.substring(0,interval)); // add the first 15 characters of str to the list
    str = str.substring(interval); // ... and remove them from str
  }
  items.add(str); // add the rest
}

После этого items представляет собой ArrayList строк в правильном порядке. Должна быть возможность расширить этот код на любую дополнительную информацию, которую вам нужно хранить вместе с фактическими строками.

person balpha    schedule 21.06.2009
comment
Спасибо балфа. Но, как я уже упоминал, проблема, с которой я столкнулся, заключается в том, чтобы установить правильный номер заказа и подтекст... как обойти это... любая помощь. - person desmiserables; 21.06.2009
comment
Спасибо Бальфа! Единственное, что если мы разделим строку с помощью '/n', мы потеряем строки, которые содержат только '/n'. Идея состоит в том, что если пользователь нажимает только клавишу ввода, все равно эти строки должны учитываться, если только такие вхождения не находятся в начале текстовой области без каких-либо символов, введенных до того, как пользователь нажмет клавишу ввода. - person desmiserables; 22.06.2009
comment
Нет, вы не пропустите пустые строки. Согласно документации Java String.split() по адресу j2ee.me/j2se/1.4.2/docs/api/java/lang/ разделение сохранит пустые строки в середине. И отбросить пустые в начале не должно быть сложно. - person balpha; 22.06.2009
comment
Спасибо, Бальфа... У меня возникла проблема с этим кодом... в основном, items.add(str.substring(0,interval)); переопределяется с помощью items.add(str); он добавляется к тому же элементу.... после цикла while - person desmiserables; 22.06.2009
comment
Мне очень жаль, но я не понимаю, что вы говорите. - person balpha; 22.06.2009

Это то, что вы пытаетесь сделать?

public static void main(String[] args)
{
  String str =
  "\n\n123456789ABCDEF123456\n123456789AB\n\n123" +
  "456789ABCDEF123456789AB\n123456789ABCDEF\n";

  List<String> parts = new ArrayList<String>();

  // remove leading line separators
  str = str.replaceFirst("\\A[\r\n]+", "");

  // match up to 15 non-newline characters, but don't
  // match a zero-length string at the end
  Matcher m = Pattern.compile("(?!\\z).{0,15}").matcher(str);
  while (m.find())
  {
    parts.add(m.group());
  }

  for (String s : parts)
  {
    System.out.println(s);
  }
}

результат:

123456789ABCDEF
123456

123456789AB


123456789ABCDEF
123456789AB

123456789ABCDEF
person Alan Moore    schedule 22.06.2009