2011-11-14 7 views

答えて

3

another answerからインスピレーションを取る:

val letters = Seq("a", "b", "c") 
val n = 3 

Iterable.fill(n)(letters) reduceLeft { (a, b) => 
    for(a<-a;b<-b) yield a+b 
} 

Seq[java.lang.String] = List(aaa, aab, aac, aba, abb, abc, aca, acb, acc, baa, bab, bac, bba, bbb, bbc, bca, bcb, bcc, caa, cab, cac, cba, cbb, cbc, cca, ccb, ccc) 

を文字列以外の何かを操作するには:

val letters = Seq(1, 2, 3) 

Iterable.fill(n)(letters).foldLeft(List(List[Int]())) { (a, b) => 
    for (a<-a;b<-b) yield(b::a) 
} 

余分な型注釈の必要性が少し面倒ですが、それは(それなしでは動作しません。誰かが別の方法を知らない限り)。

+1

サイズ 'n'の補助リストを取り除くことはできますか? – Michael

+0

@Michaelは4e6が示唆するように 'fill'を使用します。私はこれを反映するために私の答えを編集します。 – Owen

+0

素晴らしい!新しいバージョンをありがとう。 – Michael

2

別の解決策:

val alph = List("a", "b", "c") 
val n = 3 

alph.flatMap(List.fill(alph.size)(_)) 
    .combinations(n) 
    .flatMap(_.permutations).toList 

更新:あなたは出力に文字列のリストを取得したい場合は、alphは文字列でなければなりません。

val alph = "abcd" 
+0

'n 'が' alph'のサイズより大きい場合、これはうまくいかないようです。例: 'alph = List(0、1)'、 'n = 3'は、期待される' 8'とは対照的に、6つのシーケンスしか生成しません。 – dsg

関連する問題