2016-04-30 27 views
1

javaには私が利用できるいくつかの組み合わせ機能があるかどうかを調べています。私は、動的なリストを持って、きれいな方法で、すべての組み合わせを生成するJavaを持っている。Javaの組み合わせの生成

以下の文字列などのオブジェクトのリストが与えられます。簡単な方法/クリーンな方法/好ましくは既にコアのJavaに組み込まれているアイテムのすべての組み合わせを生成するか?例えば私が持っていた場合:

List<String> items = new ArrayList<String>(); 
items.add("a"); 
items.add("b"); 
List<List<String>> result = generateCombinationOf(items); 

を私が含まれるように結果を望む:{{}, {"a"}, {"b"}, {"a", "b"}}

サイドノート:私は過去にMathematicaでこのようなリストを生成することができました。私はJavaを利用したいサイドプロジェクトを持っていますが、もし可能であればmathematicaとの統合を避けることを望んでいますが、上記のようないくつかの機能が見つからなければ簡単に利用できます。

答えて

1

これを試してください。

static void generateCombinationOf(List<String> items, 
     List<String> selected, int index, List<List<String>> result) { 
    if (index >= items.size()) { 
     result.add(new ArrayList<>(selected)); 
    } else { 
     generateCombinationOf(items, selected, index + 1, result); 
     selected.add(items.get(index)); 
     generateCombinationOf(items, selected, index + 1, result); 
     selected.remove(selected.size() - 1); 
    } 
} 

static List<List<String>> generateCombinationOf(List<String> items) { 
    List<List<String>> result = new ArrayList<>(); 
    List<String> selected = new ArrayList<>(); 
    generateCombinationOf(items, selected, 0, result); 
    return result; 
} 

System.out.println(generateCombinationOf(Arrays.asList("a", "b"))); 

結果

[[], [b], [a], [a, b]] 

非再帰バージョン

static List<List<String>> generateCombinationOf(List<String> list) { 
    List<List<String>> result = new ArrayList<>(); 
    for (int i = 0, max = 1 << list.size(); i < max; ++i) { 
     List<String> comb = new ArrayList<>(); 
     for (int j = 0, k = i; k > 0; ++j, k >>= 1) 
      if ((k & 1) == 1) 
       comb.add(list.get(j)); 
     result.add(comb); 
    } 
    return result; 
} 
+0

は内蔵の何かを探していたが、誰場合は、数日後に受け付けますそうでなければ組み込みのものの例を提供します。 –

+1

Javaには、通常、これらの種類の関数が組み込まれているわけではありません。 しかし、このような機能を持たせたいのは、 'list.getCombinations();'のようなリスト上で直接呼び出せるようにしたいからです。ArrayListを拡張する独自の 'MyList'クラスを作ることができます。このメソッドを実装します。この方法を、このソリューションのコードに基づいて作成することができます。 –

+0

@DanvanderKallen、私はコアJavaの中でもこのようなことは何も見たことがありませんが、サードパーティのjarファイルがあることを望んでいます(Apacheのような人や、オープンソースの評判が良い方が望ましいです)。 Javaにはこれほど強いことがあり、そこには何もないとは信じがたいです。 –