Logic 编写代码以枚举给定数量元素的所有可能排列

Logic 编写代码以枚举给定数量元素的所有可能排列,logic,Logic,这个问题不是关于代码的语法,而是我应该如何创建一个方法 当程序启动时,为组合中的开关数量输入一个数字,每个组合包括有多少个开关可以具有开/关值。该程序然后通过所有不同的组合,并打印出它可能得出的数量 我需要帮助的部分是nextCombination方法。到目前为止,我正在使用随机生成的组合,这会导致较大数字的输出不准确且不一致。我想知道我将如何创建一个系统的方法来做这件事 以下是我输入“2”的示例: > Enter the length of the combination: 2 >

这个问题不是关于代码的语法,而是我应该如何创建一个方法

当程序启动时,为组合中的开关数量输入一个数字,每个组合包括有多少个开关可以具有开/关值。该程序然后通过所有不同的组合,并打印出它可能得出的数量

我需要帮助的部分是nextCombination方法。到目前为止,我正在使用随机生成的组合,这会导致较大数字的输出不准确且不一致。我想知道我将如何创建一个系统的方法来做这件事

以下是我输入“2”的示例:

> Enter the length of the combination: 2
> FT
> FF
> TF
> TT
> Number of combinations: 4
下面是组合类:

public class Combination {

    private int number;

    private boolean[] values;

    public Combination(int number) {
        this.number = number;
        values = new boolean[number];
    }

    public Combination(boolean[] values) {
        this.number = values.length;
        this.values = values;
    }

    public void setValue(int i, boolean value) {
        values[i] = value;
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof Combination) {
            if (((Combination) o).number != number) {
                return false;
            }
            for (int i = 0; i < ((Combination) o).number; i++) {
                if (values[i] != ((Combination) o).values[i]) {
                    return false;
                }
            }
            return true;
        }
        return super.equals(o);
    }

    @Override
    public String toString() {
        String s = "";
        for (boolean b : values) {
            s = s + (b ? "T" : "F");
        }
        return s;
    }

}
公共类组合{
私有整数;
私有布尔[]值;
公共组合(整数){
这个数字=数字;
值=新布尔值[数字];
}
公共组合(布尔[]值){
this.number=values.length;
这个值=值;
}
公共void setValue(int i,布尔值){
数值[i]=数值;
}
@凌驾
公共布尔等于(对象o){
if(组合的o实例){
if(((组合)o).number!=number){
返回false;
}
对于(int i=0;i<((组合)o).数字;i++){
if(值[i]!=((组合)o).值[i]){
返回false;
}
}
返回true;
}
返回super.equals(o);
}
@凌驾
公共字符串toString(){
字符串s=“”;
for(布尔b:值){
s=s+(b?“T”:“F”);
}
返回s;
}
}
以下是主要课程:

import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    private final static int MAXIMUM_ATTEMPTS = 500;

    private static int attempts;

    private static int number;

    private static ArrayList<Combination> cache = new ArrayList<Combination>();

    private static Scanner myScanner = new Scanner(System.in);

    public static void main(String... s) {
        System.out.print("Enter the length of the combination: ");
        number = myScanner.nextInt();
        Combination combination = nextCombination();
        while (combination != null) {
            if (!hasCombinationBeenUsed(combination)) {
                cache.add(combination);
                System.out.println(combination);
            }
            combination = nextCombination();
        }
        System.out.println("Number of combinations: " + Integer.toString(cache.size()));
    }

    private static Combination nextCombination() {
        boolean[] values = new boolean[number];
        for (int i = 0; i < number; i++) {
            values[(int) (Math.random() * number)] = ((int) (Math.random() * (2))) == 1;
        }
        Combination combo = new Combination(values);
        if (!hasCombinationBeenUsed(combo)) {
            return combo;
        } else if (attempts < MAXIMUM_ATTEMPTS) {
            attempts++;
            return nextCombination();
        } else {
            return null;
        }
    }

    private static boolean hasCombinationBeenUsed(Combination combo) {
        for (Combination c : cache) {
            if (c.equals(combo)) {
                return true;
            }
        }
        return false;
    }

}
import java.util.ArrayList;
导入java.util.Scanner;
公共班机{
私有最终静态int最大尝试次数=500;
私有静态int尝试;
私有静态整数;
私有静态ArrayList缓存=新建ArrayList();
专用静态扫描仪myScanner=新扫描仪(System.in);
公共静态无效主(字符串…s){
System.out.print(“输入组合的长度:”);
number=myScanner.nextInt();
组合=下一个组合();
while(组合!=null){
如果(!hasCombinationBeUsed(组合)){
cache.add(组合);
系统输出打印项次(组合);
}
组合=下一个组合();
}
System.out.println(“组合数:”+Integer.toString(cache.size()));
}
私有静态组合nextcomposition(){
布尔[]值=新的布尔值[数字];
for(int i=0;i
非常感谢您的帮助,如果您能让我的代码更好/更短/更高效,那么我也希望如此。谢谢:)


编辑:我只有15岁,所以我没有去学校学习过这些,所以不要太苛刻了

看起来你已经准备好学习二进制算术了!把一个组合想象成一个0和1的序列,代表一个二进制数
TFF
表示4,
TFT
表示5,依此类推。接下来的组合相当于增加值——就这么简单

在爪哇、C、C++、C等中实现二进制操作的一点帮助,你可以得到这个代码:

int size = 5;
for (int mask = 0 ; mask != (1 << size) ; mask++) {
    for (int i = size-1 ; i >= 0 ; i--) {
        System.out.print((mask & (1 << i)) == 0 ? 'F' : 'T');
    }
    System.out.println();
}
int size=5;
对于(int mask=0;mask!=(1=0;i--){

系统输出打印((遮罩和(1)也许你可以在问题中添加一些更具描述性的标题……嗯,你能给我一段代码,我可以直接插入吗?我会仔细阅读,我只是不知道在这种情况下如何开始使用它。@connor你试过我链接的ideone页面了吗?啊,不,我没有。我没有意识到这是我需要做的全部.非常感谢,这肯定解决了我的问题:)