Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带组合的Java拆分字符串_Java - Fatal编程技术网

带组合的Java拆分字符串

带组合的Java拆分字符串,java,Java,我的输入字符串是 element1-element2-element3-element4a|element4b-element5- 预期产量为 element1-element2-element3-element4a-element5- element1-element2-element3-element4b-element5- 因此,破折号(-)是分隔符,管道(|)表示位置的两个可选元素 我能够为包含单个管道的输入生成组合: ArrayList<String> finalInp

我的输入字符串是

element1-element2-element3-element4a|element4b-element5-
预期产量为

element1-element2-element3-element4a-element5-
element1-element2-element3-element4b-element5-
因此,破折号(-)是分隔符,管道(|)表示位置的两个可选元素

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

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());              
}
输出

element1-element2-element3-element4a-element5-element6a
element1-element2-element3-element4b-element5-element6a
element1-element2-element3-element4a-element5-element6b
element1-element2-element3-element4b-element5-element6b

您可以在Java中使用StringTokenizer。基本上,它是字符串的标记

public StringTokenizer(String str, String delim)
下面是一个例子:

String msg = "http://100.15.111.60:80/"; 
char tokenSeparator= ':'; 
StringTokenizer st = new StringTokenizer(msg, tokenSeparator + "");          
while(st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}

我已经为你写了一个演示,正如我在你的帖子后评论的那样,代码可能很难看,但它可以工作

public class TestSplit {
    //define a stringList hold our result.
    private static List<String> stringList = new ArrayList<String>();

    //this method fork the list array when we meet a "|"
    public static void forkStringList(){
        List<String> tmpList = new ArrayList<String>();
        for(String s: stringList){
            tmpList.add(s);
        }
        stringList.addAll(tmpList);
    }

    //when we meet "|" split two elems, should add it to 
    //the string list half-half
    public static void addTowElems(String s1, String s2){
        for(int i=0;i<stringList.size()/2;i++){
            stringList.set(i,stringList.get(i)+s1);
        }
        for(int i = stringList.size()/2;i<stringList.size();i++){
            stringList.set(i,stringList.get(i)+s2);
        }
    }
    // if not meet with a "|" just add elem to everyone of the stringlist
    public static void addOneElem(String s){
        for(int i=0;i<stringList.size();i++){
            stringList.set(i,stringList.get(i)+s);
        }
    }

    public static void main(String[] argvs){
        //to make *fork*  run, we must make sure there is a "init" string 
        //which is a empty string.
        stringList.add("");
        // this is your origin string.
        String input = "a-b-c-d|e-f";
        for (String s: input.split("\\-")){
            if(s.contains("|")){
                //when meet with "|", first fork the stringlist 
                forkStringList();
                // then add them separately 
                addTowElems(s.split("\\|")[0],s.split("\\|")[1]);
            }else {
                // else just happily add the elem to every one 
                // of the stringlist
                addOneElem(s);
            }
        }
        //checkout the result, should be expected.
        System.out.println(stringList);
    }

}
公共类TestSplit{
//定义一个字符串列表来保存我们的结果。
私有静态列表stringList=newArrayList();
//当我们遇到一个“|”时,这个方法会分叉列表数组
公共静态void forkStringList(){
List tmpList=new ArrayList();
用于(字符串s:stringList){
tmpList.add(s);
}
stringList.addAll(tmpList);
}
//当我们遇到“|”拆分两个元素时,应该将其添加到
//字符串列表的一半
公共静态void addTowerems(字符串s1、字符串s2){
对于(inti=0;i递归有帮助

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
    }
}
publicstaticvoidmain(字符串[]args){
制作(“元素1-元素2-元素3-元素4a |元素4b”
+“-element5-element6a | element6b”);
}
私有静态void生成(字符串输入){
String[]sequence=input.split(“-”);
String[][]元素=新字符串[sequence.length][];
对于(int i=0;i=elements.length){
results.add(done.toString());
系统输出打印项次(完成);
返回;
}
int donelelength=done.length();
for(字符串替代项:元素[todoIndex]){
如果(完成。长度()!=0){
完成。追加('-');
}
完成。追加(备选);
步行(结果、要素、todoIndex+1、完成);
done.setLength(doneleLength);//撤消
}
}

使用
String.split
方法两次获得可导航的
String[][]
。并使用
StringBuilder
构建最终字符串。

以下是我的迭代解决方案:

import java.util.*;

public class PathParser {

    private static final String DELIMINATOR_CONCAT = "-";
    private static final String DELIMINATOR_OPTION = "|";

    private List<String> paths;
    private List<String> stack;

    private List<String> parse(final String pathSpec) {
        stack = new ArrayList<String>();
        paths = new ArrayList<String>();
        paths.add("");
        final StringTokenizer tok = createStringTokenizer(pathSpec);
        while (tok.hasMoreTokens()) {
            final String token = tok.nextToken();
            parseToken(token);
        }
        if (!stack.isEmpty()) {
            updatePaths();
        }
        return paths;
    }

    private void parseToken(final String token) {
        if (DELIMINATOR_CONCAT.equals(token)) {
            updatePaths();
        } else if (DELIMINATOR_OPTION.equals(token)) {
            // nothing to do
        } else {
            stack.add(token);
        }
    }

    private void updatePaths() {
        final List<String> originalPaths = new ArrayList<String>(paths);
        paths.clear();
        while (stack.size() > 0) {
            paths.addAll(createNewPaths(originalPaths));
        }
    }

    private List<String> createNewPaths(final List<String> originalPaths) {
        final List<String> newPaths = new ArrayList<String>(originalPaths);
        addPart(newPaths, stack.remove(0));
        addPart(newPaths, DELIMINATOR_CONCAT);
        return newPaths;
    }

    private void addPart(final List<String> paths, final String part) {
        for (int i = 0; i < paths.size(); i++) {
            paths.set(i, paths.get(i) + part);
        }
    }

    private StringTokenizer createStringTokenizer(final String pathSpec) {
        final boolean returnDelimiters = true;
        final String delimiters = DELIMINATOR_CONCAT + DELIMINATOR_OPTION;
        return new StringTokenizer(pathSpec, delimiters, returnDelimiters);
    }

    public static void main(final String[] args) {
        final PathParser pathParser = new PathParser();
        final String input = "element1-element2-element3-element4a|element4b|element4c-element5-element6a|element6b|element6c";
        System.out.println("Input");
        System.out.println(input);
        System.out.println();

        final List<String> paths = pathParser.parse(input);

        System.out.println("Output");
        for (final String path : paths) {
            System.out.println(path);
        }
    }
}

这有助于实现同样的目标

public class MultiStringSplitter {
    public static void main(String arg[]) {
        String input = "a-b|c-d|e-f|g-h";
        String[] primeTokens = input.split("-");
        String[] level2Tokens = null;
        String element = "";
        String level2element = "";
        ArrayList stringList = new ArrayList();
        ArrayList level1List = new ArrayList();
        ArrayList level2List = new ArrayList();

        for (int i = 0; i < primeTokens.length; i++) {
            // System.out.print(primeTokens[i]);


            if (primeTokens[i].contains("|")) {
                level2Tokens = primeTokens[i].split("\\|");
                for (int j = 0; j < level2Tokens.length; j++) {
                    for (int k = 0; k < stringList.size(); k++) {
                        element = (String) stringList.get(k);
                        level2element = element + level2Tokens[j];
                        level2List.add(level2element);
                    }
                }
                stringList = new ArrayList();
                for (int w = 0; w < level2List.size(); w++) {
                    stringList.add(level2List.get(w));
                }
                level2List = new ArrayList();

            }
            else {
                if (stringList.size() > 0) {
                    for (int z = 0; z < stringList.size(); z++) {
                        element = (String) stringList.get(z);
                        element = element + primeTokens[i];
                        level1List.add(element);
                    }
                    stringList = new ArrayList();
                    for (int w = 0; w < level1List.size(); w++) {
                        stringList.add(level1List.get(w));
                    }
                    level1List = new ArrayList();

                }
                else {
                    element = element + primeTokens[i];
                    if (stringList.size() == 0) {
                        stringList.add(element);
                    }
                }
            }
        }

        for (int q = 0; q < stringList.size(); q++) {
            System.out.println(stringList.get(q));
        }
    }
}  

我怀疑这将是你自己的情况之一-你不幸运吗:如果你的输入是特定长度还是随机长度,你应该迭代输入字符串,无论何时使用
字符串[]
并将每个元素添加到分叉字符串的一半和一半-half@amitbhardwaj输入的长度是随机的。@armnotstrong我看到你先发表了评论,然后匆匆回答。对于类似的回答,你应该得到一些赞誉。希望从你那里看到其他答案。不过我更喜欢@Joop Eggen的递归解。更优雅、更有效请注意,这两种解决方案都适用于大于两个的管道组。
Input
element1-element2-element3-element4a|element4b-element5-element6a|element6b

Output
element1-element2-element3-element4a-element5-element6a-
element1-element2-element3-element4b-element5-element6a-
element1-element2-element3-element4a-element5-element6b-
element1-element2-element3-element4b-element5-element6b-
public class MultiStringSplitter {
    public static void main(String arg[]) {
        String input = "a-b|c-d|e-f|g-h";
        String[] primeTokens = input.split("-");
        String[] level2Tokens = null;
        String element = "";
        String level2element = "";
        ArrayList stringList = new ArrayList();
        ArrayList level1List = new ArrayList();
        ArrayList level2List = new ArrayList();

        for (int i = 0; i < primeTokens.length; i++) {
            // System.out.print(primeTokens[i]);


            if (primeTokens[i].contains("|")) {
                level2Tokens = primeTokens[i].split("\\|");
                for (int j = 0; j < level2Tokens.length; j++) {
                    for (int k = 0; k < stringList.size(); k++) {
                        element = (String) stringList.get(k);
                        level2element = element + level2Tokens[j];
                        level2List.add(level2element);
                    }
                }
                stringList = new ArrayList();
                for (int w = 0; w < level2List.size(); w++) {
                    stringList.add(level2List.get(w));
                }
                level2List = new ArrayList();

            }
            else {
                if (stringList.size() > 0) {
                    for (int z = 0; z < stringList.size(); z++) {
                        element = (String) stringList.get(z);
                        element = element + primeTokens[i];
                        level1List.add(element);
                    }
                    stringList = new ArrayList();
                    for (int w = 0; w < level1List.size(); w++) {
                        stringList.add(level1List.get(w));
                    }
                    level1List = new ArrayList();

                }
                else {
                    element = element + primeTokens[i];
                    if (stringList.size() == 0) {
                        stringList.add(element);
                    }
                }
            }
        }

        for (int q = 0; q < stringList.size(); q++) {
            System.out.println(stringList.get(q));
        }
    }
}  
    abdfh
    acdfh
    abefh
    acefh
    abdgh
    acdgh
    abegh
    acegh