Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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_Permutation - Fatal编程技术网

查找所有排列代码问题(Java)

查找所有排列代码问题(Java),java,permutation,Java,Permutation,我写这段代码是为了找到一些数字的所有可能排列。但我不想两次使用一个数字: 123132213是可以的,但它会生成像122、121等这样的数字。 我做错了什么 import java.util.HashSet; public class main { public static void main(String[] args) { HashSet<Integer> l = new HashSet<Integer>();

我写这段代码是为了找到一些数字的所有可能排列。但我不想两次使用一个数字:
123132213是可以的,但它会生成像122、121等这样的数字。
我做错了什么

import java.util.HashSet;

public class main {

public static void main(String[] args) {        

    HashSet<Integer> l = new HashSet<Integer>();        
    for(int i=0;i<=3;i++){
        l.add(i);
    }       
    perm(l,3,new StringBuffer());

}

 static void perm(HashSet<Integer> in, int depth,StringBuffer out){             
    if(depth==0){
        System.out.println(out);
        return;
    }       

    int len = in.size();
    HashSet<Integer> tmp = in;

    for(int i=0;i<len;i++){
        out.append(in.toArray()[i]);
        tmp.remove(i);

        perm(tmp,depth-1,out);

        out.deleteCharAt(out.length()-1);
        tmp.add(i);
    }
}
}
import java.util.HashSet;
公共班机{
公共静态void main(字符串[]args){
HashSet l=新的HashSet();

for(int i=0;i
tmp.remove(i)
是错误的。您需要从tmp中删除第i个元素…您正在删除元素“i”。因此,执行
tmp.remove(in.toArray()[i])
。我认为这将解决此问题。例如,如果第0个元素是17,则执行
tmp.remove(i)
将从哈希集中删除所有零,而不是“17”.tmp.remove(i)

tmp.remove(i)
是错误的。您需要从tmp中删除第i个元素…您正在删除元素“i”。因此,执行
tmp.remove(in.toArray()[i])
。我认为这将解决此问题。例如,如果第0个元素是17,则执行
tmp.remove(i)
将从哈希集中删除所有零,而不是“17”.

看起来自动装箱正在吸引你。当你用“i”调用移除时,我的猜测是“i”已被装箱到另一个对象,因此在你的哈希集中找不到。

看起来自动装箱正在吸引你。当你用“i”调用移除时,我的猜测是“i”已装箱到另一个对象,因此在y中找不到我们的HashSet。

这里有一个使用HashSet的更简单的实现。我使用字符串,但概念保持不变

public void printPermutations(String str){
    HashSet<String> hs = new HashSet<>();
    printPermutations("", str, hs);
}

public void printPermutations(String prefix, String end, HashSet<String> hs){
    if(end.equals(""))
        System.out.println(prefix);
    for(int i = 0; i < end.length(); ++i)
        if(hs.add(prefix + end.charAt(i))){
            printPermutations(prefix + end.charAt(i), 
                    end.substring(0,i) + end.substring(i + 1, end.length()), hs);
        }

}
public void打印置换(String str){
HashSet hs=新的HashSet();
印刷排列(“”,str,hs);
}
公共void打印置换(字符串前缀、字符串结尾、哈希集){
if(end.equals(“”)
System.out.println(前缀);
对于(int i=0;i
下面是一个使用哈希集的简单得多的实现。我使用字符串,但概念保持不变

public void printPermutations(String str){
    HashSet<String> hs = new HashSet<>();
    printPermutations("", str, hs);
}

public void printPermutations(String prefix, String end, HashSet<String> hs){
    if(end.equals(""))
        System.out.println(prefix);
    for(int i = 0; i < end.length(); ++i)
        if(hs.add(prefix + end.charAt(i))){
            printPermutations(prefix + end.charAt(i), 
                    end.substring(0,i) + end.substring(i + 1, end.length()), hs);
        }

}
public void打印置换(String str){
HashSet hs=新的HashSet();
印刷排列(“”,str,hs);
}
公共void打印置换(字符串前缀、字符串结尾、哈希集){
if(end.equals(“”)
System.out.println(前缀);
对于(int i=0;i
Ok,我对自动装箱不太了解。我认为,代码本身不是最佳的。我可以使用哈希集以外的其他数据结构吗?@gethan自动装箱是Java将基本类型(例如int)转换为等效类(例如Integer)的地方或者反过来做。当你第一次向哈希集中添加一个int时,它会被转换成一个对象。让我们称这个对象为“AnInt”。然后当你删除第二个int时,它会被装箱到一个对象“AnotherInt”,而这两个对象并不相同。因此哈希集找不到第一个要删除的对象。好吧,我对Autobo不太了解xing.我认为,代码本身不是最优的。我可以使用HashSet以外的其他dada结构吗?@gethan Autoboxing是Java将原语类型(例如int)转换为等价类(例如Integer)的地方或者以相反的方式执行该过程。因此,当您第一次向哈希集添加int时,它会转换为一个对象。让我们将该对象称为“AnInt”。然后,当您删除第二个int时,它会被装箱到一个对象“AnotherInt”,而这两个对象并不相同。因此哈希集找不到要删除的第一个对象。