Преобразовать строку (отформатированную как ArrayList <String>) в фактический ArrayList <String> - PullRequest
1 голос
/ 12 августа 2010

Я пытаюсь преобразовать строку в ArrayList.Например, мое веб-приложение Struts2 возвращает строку с именованной строкой в ​​формате, подобном следующему:

[A, BB, CCC, DDDD, 1, 0, 1] (что-то вроде этих строк)

Мне нужно преобразовать их в ArrayList, чтобы я мог предварительно заполнить некоторые формы на другой странице JSP.Я жестко закодировал метод для преобразования таких строк в список:

        StringBuffer rowBuffer = new StringBuffer(row);
        int startIndex = 0;
        int endIndex = rowBuffer.indexOf(",") - 1;
        rowBuffer.deleteCharAt(rowBuffer.indexOf("["));
        rowBuffer.deleteCharAt(rowBuffer.indexOf("]"));
        while(startIndex != -1 && endIndex != -1 && startIndex < endIndex)
        {
          String subString = rowBuffer.substring(startIndex, endIndex);

       if(subString.contains(","))
       {
          rowList.add(" ");
          startIndex = endIndex + 1;
          endIndex = rowBuffer.indexOf(",", startIndex);
       }

       else
       {
        rowList.add(subString);
        startIndex = endIndex + 2;
        endIndex = rowBuffer.indexOf(",", startIndex + 1);
       }

       if(endIndex == -1)
       {
          rowList.add(rowBuffer.substring(startIndex));
          break;
       }
    }

Это прекрасно работает в тех случаях, когда все поля заполнены.Однако, допустим, у меня есть строка, которая выглядит следующим образом: [A, BB,,, 1, 0, 0] (3-е и 4-е поля отсутствуют), затем я получаю что-то, что не работает (пустые элементы нене правильно регистрируется, и размер списка составляет 6, тогда как он должен быть 7).Есть ли более элегантное решение, чем жесткое кодирование?Если нет, может ли кто-нибудь указать мне правильное направление, как обрабатывать дела с пустыми полями?Спасибо!

Ответы [ 3 ]

1 голос
/ 12 августа 2010

Попробуйте, пожалуйста:

import java.util.regex.*;

// ...

// Working code    
rowBuffer.deleteCharAt(rowBuffer.indexOf("["));
rowBuffer.deleteCharAt(rowBuffer.indexOf("]"));
// Create a pattern to match breaks
Pattern p = Pattern.compile("\\s*,\\s*");
// Split input with the pattern
String[] result = p.split(rowBuffer);
rowList = new ArrayList(Arrays.asList(result)); 

ПРИМЕЧАНИЕ. Предполагается, что сами строки не содержат запятых и не заключаются в кавычки. Если вы хотите анализировать реальные CSV с запятыми в полях и значениях в кавычках, НЕ используйте регулярные выражения и split; и вместо этого используйте специальный CSV-анализатор конечного автомата (вот один пример: http://opencsv.sourceforge.net/ - или вы можете свернуть свой собственный, как Пример BalusC здесь )

0 голосов
/ 12 августа 2010

Предполагая, что формат соответствует AbstractCollection.toString(), вы можете просто:

  • Снять окружающие скобки (с простых substring)
  • Тогда split на ", " (запятая и пробел)
  • Оберните String[] в List<String>, используя Arrays.asList
    • Используйте это для заполнения ArrayList<String>, если необходимо

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

Вот фрагмент для иллюстрации:

    String s = "[A, BB, CCC, DDDD, 1, 0, 1]";
    String[] parts = s.substring(1, s.length() - 1).split(", ");
    List<String> list = new ArrayList(Arrays.asList(parts));

    for (String part : list) {
        System.out.print("{" + part + "} ");
    } // {A} {BB} {CCC} {DDDD} {1} {0} {1} 
0 голосов
/ 12 августа 2010

Ну, я немного изменил свой код и заставил его работать (возможно, это далеко не самое элегантное решение, но оно работает для меня ...

    StringBuffer rowBuffer = new StringBuffer(row);
    int startIndex = 0;
    int endIndex = rowBuffer.indexOf(",") - 1;
    rowBuffer.deleteCharAt(rowBuffer.indexOf("["));
    rowBuffer.deleteCharAt(rowBuffer.indexOf("]"));
    while(startIndex != -1 && endIndex != -1 && startIndex < endIndex)
    {
      String subString = rowBuffer.substring(startIndex, endIndex);

       if(subString.contains(","))
       {
          rowList.add(" ");
          startIndex = endIndex - 1;
          endIndex = rowBuffer.indexOf(", ", startIndex + 1);
       }

       else
       {
         if(subString.equals("1"))
             rowList.add("True");
         else if(subString.equals("0"))
             rowList.add("False");
         else
          rowList.add(subString);
        startIndex = endIndex + 2;
        endIndex = rowBuffer.indexOf(",", startIndex + 1);
       }

       if(endIndex == -1)
       {
          if(subString.equals("1"))
             rowList.add("True");
          else if(subString.equals("0"))
             rowList.add("False");
          break;
       }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...