Java使用组合拆分字符串

Vij*_*uri 2 java

我的输入字符串是

element1-element2-element3-element4a|element4b-element5-
Run Code Online (Sandbox Code Playgroud)

预期的产出是

element1-element2-element3-element4a-element5-
element1-element2-element3-element4b-element5-
Run Code Online (Sandbox Code Playgroud)

因此短划线( - )是分隔符,管道(|)表示位置的两个替代元素.

我能够为包含单个管道的输入生成组合:

ArrayList<String> finalInput = new ArrayList<String>();
String Input = getInputPath();
StringBuilder TempInput = new StringBuilder();
if(Input.contains("|")) {
    String[] splits = Input.split("\\|", 2);
    TempInput.append(splits[0]+"-"+splits[1].split("-", 2)[1]);
    finalInput.add(TempInput.toString());
    TempInput = new StringBuilder();
    String[] splits1 = new StringBuilder(Input).reverse().toString().split("\\|", 2);
    finalInput.add(TempInput.append(splits1[0]+"-"+splits1[1].split("-", 2)[1]).reverse().toString());              
}
Run Code Online (Sandbox Code Playgroud)

但是如果有多个管道符号,则此逻辑会失败.

  • 如何仅在最后一次出现时拆分字符串?

有没有有效的方法来使用拆分字符串与组合?

输入:

element1-element2-element3-element4a|element4b-element5-element6a|element6b
Run Code Online (Sandbox Code Playgroud)

输出:

element1-element2-element3-element4a-element5-element6a
element1-element2-element3-element4b-element5-element6a
element1-element2-element3-element4a-element5-element6b
element1-element2-element3-element4b-element5-element6b
Run Code Online (Sandbox Code Playgroud)

Joo*_*gen 5

递归有帮助.

public static void main(String[] args) {
    produce("element1-element2-element3-element4a|element4b"
        + "-element5-element6a|element6b");
}

private static void produce(String input) {
    String[] sequence = input.split("-");
    String[][] elements = new String[sequence.length][];
    for (int i = 0; i < sequence.length; ++i) {
        elements[i] = sequence[i].split("\\|");
    }
    List<String> results = new ArrayList<>();
    walk(results, elements, 0, new StringBuilder());
}

private static void walk(List<String> results, String[][] elements,
        int todoIndex, StringBuilder done) {
    if (todoIndex >= elements.length) {
        results.add(done.toString());
        System.out.println(done);
        return;
    }
    int doneLength = done.length();
    for (String alternative : elements[todoIndex]) {
        if (done.length() != 0) {
            done.append('-');
        }
        done.append(alternative);
        walk(results, elements, todoIndex + 1, done);
        done.setLength(doneLength); // Undo
    }
}
Run Code Online (Sandbox Code Playgroud)

String.split方法使用两次以获得可导航的方法String[][].并使用构建最终的String a StringBuilder.