2012-05-07 10 views
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; 
    } 

} 

は、ここでの主なクラスです:

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ので、私は、このいずれかのために学校に行っていないので、あなたがバイナリ算術演算について学ぶ準備ができているように見えます

+1

多分あなたは質問にもっと説明的なタイトルをつけることができます... –

答えて

2

あまりにも過酷ことはありません!組み合わせは、2進数を表す0と1のシーケンスとして考えることができます。 TFFは4を表し、TFTは5であり、以下同様である。次のコンビネーションを思いつくことは、値を増やすことと同じです。それは簡単です!などのJava、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(); 
} 

どのようにそれを確認するには、このコードat ideoneで遊び、その後、page or two on bit operationsを読みます働く私はあなたが小数の世界にいくつかの並行をすることをお勧めします、あなたは一般的に数字のシステムについてたくさん学ぶでしょう!

+0

うーん、ちょうど私がちょうどプラグインできるコードを私に与えることができるでしょうか?私はこれを読んで、この状況で私がどのように使い始めるのか分かりません。 – connor

+0

@connor私がリンクしている理想のページを試しましたか? – dasblinkenlight

+0

ああ、私はしませんでした。私はそれが私がこれを行うのに必要なすべてであることを認識していませんでした。おかげで、これは確かに私の問題を解決:) – connor