Как разбить строку на список в этой работе?Джава - PullRequest
0 голосов
/ 14 октября 2011

У меня есть такая строка.

<body>
Search Results:
<br>
<br>

    Member ID: 10149
    <br>
    Title:
    <br>
    First Name: Skye
    <br>
    Middle Name: Susan
    <br>
    Last Name: Sommers
    <br>
    Comment: Entry Report completed.
    <br>
    Time Stamp: 2011-10-13 14:43:36
    <br>
    Select Agent: Century 21
    <br>
    Agent Details: Peter Thorpe Century 21 33 Diamond Drive Newcastle NSW 2300
    <br>
    Street: 49 Fairway Court
    <br>
    Suburb: Newcastle
    <br>
    Postcode: 2300
    <br>
    <br>
    Member ID: 10149
    <br>
    Title:
    <br>
    First Name: Skye
    <br>
    Middle Name:
    <br>
    Last Name: Sommers
    <br>
    Comment: Qtr inpection showed residence in very good condition. Walls and floors very clean. Back and front yard both neatly kept.
    <br>
    Time Stamp: 2011-10-13 12:40:31
    <br>
    Select Agent: Century 21
    <br>
    Agent Details: Peter Thorpe Century 21 33 Diamond Drive Newcastle NSW 2300
    <br>
    Street: 49 Fairway Court
    <br>
    Suburb: Newcastle
    <br>
    Postcode: 2300

Как разбить строку на массив с массивом с первым членом:

Member ID: 10149 
 Title: 
 First Name: Skye 
 Middle Name: Susan 
 Last Name: Sommers 
 Comment: Entry Report completed. 
 Time Stamp: 2011-10-13 14:43:36 
 Select Agent: Century 21 
 Agent Details: Peter Thorpe Century 21 33 Diamond Drive Newcastle NSW 2300 
 Street: 49 Fairway Court 
 Suburb: Newcastle 
 Postcode: 2300

Спасибо за помощь!

Ответы [ 6 ]

1 голос
/ 14 октября 2011

Ваш порядок элементов не меняется, однако вы хотите создать List из bean-компонентов. Могу ли я предложить вместо этого Apache Commons DynaBeans в этой ситуации? Это объекты, которые вы можете создавать на лету и получать доступ к значениям с помощью bean.get("key");, а вы можете устанавливать значения с помощью bean.set("key", "value");

Итак, что вы можете сделать, это разделить ваш html следующим образом:

String html = "<your html>";
List l = new ListArray();
int index = 0;
while((index = html.indexOf("Member", index)) > -1) {
   //nextIndex is the end of the first element.
   int nextIndex = html.indexOf("<br>\n<br>",index);
   String element = html.substring(index, nextIndex);
   //parse element string to create dynabeans
   DynaBean bean = createDynaBean(element);
   l.add(bean);
   index = nextIndex;

}

Я не предоставил код для создания dynabean. посмотрите здесь пример того, как создать dynabean . Поскольку в вашем List есть строка, представляющая 1 элемент, должно быть легко использовать split() или indexOf() и т. Д., Чтобы получить значения для нужных элементов. Я бы начал с разделения на \n, а затем на :, что дало бы мне ключ и значение для каждой строки.

Надеюсь, это поможет.

1 голос
/ 14 октября 2011

Это сложно сделать быстро из-за потенциальных конфликтов. Вы можете использовать String.replace() для удаления тегов <br>. Тогда вы могли бы сделать String.split() для слова «Участник», но тогда оно сломалось бы, если бы «Участник» появлялся где-то еще.

Более контролируемый, но сложный метод: split() на новых строках, а затем чтение каждой строки, проверка на startsWith() и последующее заполнение соответствующих данных. Учитывая, что приведенный выше результат не намного более полезен, это также позволит вам на самом деле создать Record объект и заполнять его построчно.

0 голосов
/ 14 октября 2011

Сначала разделите в соответствии с <br>\n<br>, а затем разделите элемент массива [1] с символом <br>, затем выполните итерацию по всем разделенным строкам и добавьте все, что вы хотите.

0 голосов
/ 14 октября 2011

Я бы сделал это следующим образом:

// remove spaces and tags
html = html.replaceAll("(?m)(<.*?>|Search Results:|^ *)", "");
// remove empty lines
html = html.replaceAll("(?m)^[ \t]*\r?\n", "");
// split by newlines
String[] results = html.split("\\n")
// use results

Затем можно разделить каждый results[i] на :, чтобы получить ключ и значение.

0 голосов
/ 14 октября 2011

Вот решение в одну строку для его измельчения:

String[] parts = input.split("(?m)\\s*(^.*<.*$)+\\s*");

Исходя из введенного выше, вы получите:

[, Search Results:, , Member ID: 10149, Title:, First Name: Skye]

Итерируйте, игнорируя то, что вам не нужно. Предполагая, что «Результаты поиска:» помечают нового человека, сделайте это:

List<Map<String, String>> peopleList = new ArrayList<Map<String, String>>();
Map<String, String> person = null;
for (String part : parts) {
    if (!part.contains(":") || person == null) continue;
    if (parts.startsWith("Search Results")) {
        person = new HashMap<String, String>();
        peopleList.add(person);
        continue;
    }
    String[] nameValue = part.trim().split(":");
    person.put(nameValue[0].trim(), nameValue[1].trim());
}

Теперь у вас есть список карт, на каждой из которых есть записи типа «ID участника» = «10149» и т. Д.

0 голосов
/ 14 октября 2011

Что бы я сделал, это псевдокод:

Member newMember = null;
List<Member> result = new ArrayList<Member>();

for each line
   trim whitespace
   // control new objects
   if line starts with "Member ID:"
      if newMember != null
          result.add(newMember);
      newMember = new Member()

   // add values to the current object
   else if newMember != null (at the beginning there's no created object)
      if line starts with "field1:"
         newMember.setField1(parse value from line)
      else if line starts with "field2:"
         newMember.setField2(parse value from line)

Этого должно быть достаточно, если ваш вклад правильно сформирован.

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