Сложное разбиение строки в Java - PullRequest
2 голосов
/ 10 июня 2010

Рассмотрим следующую строку:

5|12345|value1|value2|value3|value4+5|777|value1|value2|value3|value4?5|777|value1|value2|value3|value4+

Вот как я хочу разделить строку, разделить ее +, чтобы я получил такой результат:

myArray[0] = "5|12345|value1|value2|value3|value4";

myArray[1] = "5|777|value1|value2|value3|value4?5|777|value1|value2|value3|value4";

если строка не содержит символ "?" разделить ее на "|" и продолжить до части II, если строка содержит "?" разделить ее и для каждой части разделить на "|" и продолжить часть II.

Вот часть II:

myObject.setAttribute1(newString[0]);
...
myObject.setAttribute4(newString[3]);

Вот что у меня так далеко:

private static String input = "5|12345|value1|value2|value3|value4+5|777|value1|value2|value3|value4?5|777|value1|value2|value3|value4+";

public void mapObject(String input){

String[] myArray = null;

    if (input.contains("+")) {
        myArray = input.split("+");
    } else {
        myArray = new String[1];
        myArray[0] = input;
    }

    for (int i = 0; i < myArray.length; i++) {

        String[] secondaryArray = null;
        String[] myObjectAttribute = null;

        if (myArray[i].contains("?")) {
            secondaryArray = temporaryString.myArray[i].split("?");

            for (String string : secondaryArray) {
                myObjectAttribute = string.split("\\|");
            }
        } else {
            myObjectAttribute = myArray[i].toString().split("\\|");
        }

        myObject.setAttribute1(myObjectAttribute[0]);
        ...
        myObject.setAttribute4(myObjectAttribute[3]);
                    System.out.println(myObject.toString());
}

Проблема:

Когда я разделяю myArray, пройдя через myArray [0], все настроено хорошо, как и должно быть.

Затем идет myArray [1], его разделяют на две части, а вторая переопределяет значение первой (откуда я это знаю?). Я переопределил toString() метод myObject, когда я заканчиваю, я печатаю установленные значения, чтобы я знал, что он переопределяет, кто-нибудь знает, как я могу это исправить?

Ответы [ 2 ]

3 голосов
/ 10 июня 2010

Я не совсем уверен, что намерение здесь, но в этом фрагменте кода

secondaryArray = temporaryString.split("?");

for (String string : secondaryArray) {
    myObjectAttribute = string.split("\\|");
}

, если secondaryArray имеет два элемента после операции разбиения, вы выполняете итерацию по каждой половине и повторно-присваивание myObjectAttribute на выход string.split ("\ |") каждый раз.Не имеет значения, что находится в первом элементе secondaryArray, так как после выполнения этого кода myObjectAttribute будет содержать результат split("\\|") для последнего элемента в массиве.

Также,нет смысла вызывать .toString() для объекта String, как в temporaryString = myArray[i].toString().

2 голосов
/ 10 июня 2010

Код, кажется, не в состоянии справиться с возможным расширением строк во вторичном случае. Чтобы сделать код более понятным, я бы использовал список, а не массив.

private static String input = "5|12345|value1|value2|value3|value4+5|777|value1|value2|value3|value4?5|777|value1|value2|value3|value4+";

private void split(List<String> input, List<String> output, String split) {
    for (String s: input) {
          if (s.contains(split))
          {
             output.addAll(Arrays.asList(s.split(Pattern.quote(split)));
          }
          else
              output.add(s);
    }
}

public void mapObject (String input) {

List<String> inputSrings = new ArrayList<String>();
List<String> splitPlus = new ArrayList<String>();

inputStrings.add(input);

split(inputStrings, splitPlus);

List<String> splitQuest = new ArrayList<String>();
split(splitPlus, splitQuest, "?");

for (String s: splitQuest) {   
   // you can now set the attributes from the values in the list
   // splitPipe

   String[] attributes = s.split("\\|");
   myObject.setAttribute1(attributes[0]);
   ....
   myObject.setAttribute4(attributes[3]);
   System.out.println(myObject);
}

}

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