Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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,我需要将一个集合a拆分为两个集合B和C,并在B和C中找到a'元素的所有可能拆分 所以当第一个拆分大小为2时 [abcd]->[ab][cd]、[ac][bd]、[cd][ab] 当第一个拆分大小为1时 [abcd]->[b][acd]、[a][bdc]、[d][abc] 您知道如何做到这一点吗?您可以使用apache commons math util for java。如果您使用的是maven,请在pom中添加其依赖项,否则请手动下载并添加jar //n是元素的编号。k是k-组合 公共组合(

我需要将一个集合a拆分为两个集合B和C,并在B和C中找到a'元素的所有可能拆分

所以当第一个拆分大小为2时

[abcd]->[ab][cd]、[ac][bd]、[cd][ab]

当第一个拆分大小为1时

[abcd]->[b][acd]、[a][bdc]、[d][abc]


您知道如何做到这一点吗?

您可以使用apache commons math util for java。如果您使用的是maven,请在pom中添加其依赖项,否则请手动下载并添加jar

//n是元素的编号。k是k-组合
公共组合(整数n,整数k)
//您可以使用此方法获得每个组合
公共迭代器迭代器()
这将为您提供所有k组合,并且值将以索引的形式显示。您需要将索引转换为元素

如果是数组arr,则可以执行arr[i]。
如果list,list.get(i)

你是说像这样的算法吗?我写得很快,希望能有所帮助:

public void split(int s, String list1, String list2){
    if(s > list1.length()){
        System.err.println("To big s");
        return;
    }
    if(s == 0){
        System.out.println(list2 + " "+ list1);
        return;
    }
    for(int i = 0; i < list1.length(); i++){
            String temp = list1.substring(0, i) + list1.substring(i+1, list1.length());
            String temp2 = list2 + list1.charAt(i);
            split(s-1, temp, temp2);
    }       
}
public void split(int-s,字符串列表1,字符串列表2){
如果(s>list1.length()){
System.err.println(“到大s”);
返回;
}
如果(s==0){
System.out.println(list2+“”+list1);
返回;
}
对于(int i=0;i
您正在尝试创建给定长度的所有排列。这是一个字符串,但技术是一样的:它不是置换。abcd和bacd是不同的排列,但如果在中间分开。两个拆分都是相同的。这是一个组合问题。嗯,好吧,我当时理解错了:)对,这不是关于排列。这就像一个符咒!在上面的例子中,我设置了N=4和k=2,迭代所有的k组合,将它们用作A的索引(因此我得到了第一次拆分),然后从A的副本中删除它们(这是第二次拆分)。酷。您可以有一个包含整数的集合(或列表),而不是创建的另一个副本。使用所有索引进行初始化,然后可以使用set.removeAll(Arrays.asList(first-split int[])获取第二个分割索引。可能会减少线的数量。如果这样做,您将始终拥有一个副本,并且拆分由索引标识。如果您想解决此问题,可以随时使用[i]。关键是要尽量避免复制原始数组,这样您的代码就会简洁易懂。
public void split(int s, String list1, String list2){
    if(s > list1.length()){
        System.err.println("To big s");
        return;
    }
    if(s == 0){
        System.out.println(list2 + " "+ list1);
        return;
    }
    for(int i = 0; i < list1.length(); i++){
            String temp = list1.substring(0, i) + list1.substring(i+1, list1.length());
            String temp2 = list2 + list1.charAt(i);
            split(s-1, temp, temp2);
    }       
}