Java中的复杂字符串拆分

时间:2010-06-09 20:40:05

标签: java string

考虑以下字符串:

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";

如果string has不包含char "?"则将其与"|"分开并继续到第II部分,如果string包含"?"则将其拆分并且用于每个部分将其与"|"分开并继续第二部分。

这是第二部分:

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],它分为两部分,然后第二部分覆盖了第一部分的值(我怎么知道?)。我已经覆盖了myObject的toString()方法,当我完成时我打印设定值,所以我知道它会覆盖它,有人知道我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

我不太确定这里有什么意图,但在这段代码中

secondaryArray = temporaryString.split("?");

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

如果secondaryArray在拆分操作后有两个元素,则每次都会迭代每一半并将myObjectAttribute重新分配给string.split(“\ |”)的输出。 secondaryArray的第一个元素中的内容并不重要,因为在此代码运行之后myObjectAttribute将在数组的最后一个元素中包含split("\\|")的结果。

此外,与.toString()中一样,在String对象上调用temporaryString = myArray[i].toString()没有意义。

答案 1 :(得分:2)

代码似乎无法处理二级情况下字符串的可能扩展。为了使代码更清晰,我将使用List而不是数组。

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);
}

}