この質問はコードの構文についてはあまり知られていませんが、与えられた数の要素のすべての可能な並べ替えを列挙するコードを書く
プログラムが開始するときに、組み合わせのスイッチ数の数値を入力します。各組み合わせは、オン/オフ値を持つことができるスイッチの数からなります。その後、プログラムはさまざまな組み合わせをすべて調べ、それが出現する可能性のある金額を印刷します。
私が助けが必要な部分は、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;
}
}
は、ここでの主なクラスです:
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;
}
}
これですべてのヘルプ私のコードをより良く/短く/より効率的にすることができれば、それも好きです。感謝:)
編集:私は唯一の15ので、私は、このいずれかのために学校に行っていないので、あなたがバイナリ算術演算について学ぶ準備ができているように見えます
多分あなたは質問にもっと説明的なタイトルをつけることができます... –