2012-02-12 20 views
0

文字A、B、C、Dのすべての組み合わせをリストするプログラムを作成しています。可能性のあるすべての並べ替えをリストするプログラムを作成しました。Java - リストの組み合わせ

しかし、どのように(ように長いものがあるように、他の表示されていない必要、すなわち:ABCD = DCBA及びAB = BA)全ての組み合わせを動作し、生成するためのプログラムを書き換えることになります。

これまでのところ、私の現在のプログラムのコードは次のとおりです。ここで

import java.util.ArrayList; 

public class Perms { 

    public static void main(String[] args) { 

     ArrayList<Character> characters = new ArrayList<Character>(); 

     characters.add('A'); 
     characters.add('B'); 
     characters.add('C'); 
     characters.add('D'); 

     int count = 0; 

     for (int i = 0; i < characters.size(); i++) { 
      for (int j = 0; j < characters.size(); j++) { 
       for (int k = 0; k < characters.size(); k++) { 
        for (int d = 0; d < characters.size(); d++) { 
         count++; 
         System.out.println(count + ": " + characters.get(i) + characters.get(j) + characters.get(k) + characters.get(d)); 
        } 
       } 
      } 
     } 

    } 
} 
+3

申し訳ありません、あなたの質問についてより明確に伝えることができますか?セット{A、B、C、D}には4つの要素を持つ1つの文字列があり、順序は関係ありません:ABCDまたはBCDAまたはCDAB ...ですので、ただ1つの文字列であり、 。あなたの質問は、すべてのセットが{A、B、C、D}から作られたリストです。それが本当なら、いくつかの答えがある:{A} {B} {C} {D} {AB} {AC} ......そうですか? – hqt

+1

申し訳ございません。私は、ABCD、ABC、ABなどを印刷することを意味しました。 – mino

+0

与えられたコードはABCDのすべての可能な置換を生成するのではなく、長さ4のアルファベットABCDのすべての文字列を生成します。プログラムが印刷する最初の行であるAAAAは​​ABCDの順列ではありません。 –

答えて

5

2番目のケースは、4桁のバイナリ値のリストに相当します。 Aが一番右の数字で、Dが一番左にあるとしましょう。以下のよう

DCBA 
0000 
0001 
0010 
0011 
0100 
... 
1110 
1111 

各組み合わせが復号される:

DCBA 
1010 = DB 

B及びD位置に1があるので、次に、合計16個の組み合わせが存在します。

Javaでバイナリ番号を生成またはデコードするには、さまざまな方法があります。ビット単位操作に例えば

public static void main(String[] args) { 

    // starting from 1 since 0000 is not needed 
    for(int i=1; i<16; ++i) { 

     // bitwise operation & detects 1 in given position, 
     // positions are determined by sa called "masks" 
     // mask has 1 in position you wish to extract 
     // masks are 0001=1, 0010=2, 0100=4 and 1000=8 
     if((i & 1) > 0) System.out.print("A"); 
     if((i & 2) > 0) System.out.print("B"); 
     if((i & 4) > 0) System.out.print("C"); 
     if((i & 8) > 0) System.out.print("D"); 

     System.out.println(""); 

    } 
} 
1

は、あなたの問題のために私のコードです:)

私はちょうど新しいので、私の答えは醜いことごめんなさいJavaのコーナー。

import java.util.Vector; 

public class StackOverFlow { 

    static int n ; 
    static Vector<String> set; 
    static int[] d ; 
    public static void recursion(int t){ 
     if(t==n){ 
      PRINT(); 
      return; 
     } 
     d[t]=1; 
     recursion(t+1); 
     d[t]=0; 
     recursion(t+1); 
    } 

    public static void PRINT(){ 
     System.out.println("ANSWER"); 
     for(int i=0;i<n;i++) 
      if(d[i]==1) System.out.println(set.elementAt(i)); 
    } 


    public static void main(String[] args) {     
     n = 4; 
     set = new Vector<String>(4); 
     d = new int[6]; 
     set.add("a"); 
     set.add("b"); 
     set.add("c"); 
     set.add("d"); 
     recursion(0); 
    } 
} 
1
// Returns all combinations of a List of Characters (as Strings) 
// THIS METHOD MODIFIES ITS ARGUMENT! Make sure to copy defensively if necessary 
List<String> charCombinations(List<Character> chars) 
{ 
    if(chars.isEmpty()) 
    { 
    List<String> result = new ArrayList<String>(); 
    result.add(""); 
    return result; 
    } 
    else 
    { 
    Character c  = chars.remove(0); 
    List<String> result = charCombinations(chars); 
    int   size = result.size(); 
    for(int i = 0; i < size; i++) 
     result.add(c + result.get(i)); 
    return result; 
    } 
} 

Setがセットから単一の項目をポップアウトする方法を持っていないので、私は、引数にListを使用。

関連する問題