私はまだscalaを学んでいます。一言あれば
val word = "abcd"
作成したい
Map("bcd","acd","abd","abc")
はるかに私が試した:
println(word.map(word.split(_).foldLeft("")(_+_)))
しかし、単語に char が重複していると失敗します。
助けてください。
私はまだscalaを学んでいます。一言あれば
val word = "abcd"
作成したい
Map("bcd","acd","abd","abc")
はるかに私が試した:
println(word.map(word.split(_).foldLeft("")(_+_)))
しかし、単語に char が重複していると失敗します。
助けてください。
これは必ずしも最も効率的なアプローチではありませんが、inits
andtails
メソッドを使用してこれをかなりきれいに行うことができます。おそらく「機能的ではない」インデックスを処理する必要はありません。
scala> val word = "abcd"
word: String = abcd
scala> (word.inits.toList.tail.reverse zip word.tails.toList.tail).map {
| case (x, y) => x + y
| }
res0: List[String] = List(bcd, acd, abd, abc)
重複で期待どおりに機能します。
それがどのように機能するかを確認するには、次のことを考慮してください。
scala> word.inits foreach println
abcd
abc
ab
a
scala> word.tails foreach println
abcd
bcd
cd
d
そこから、目的の結果を得るには、2 つを組み合わせるだけです。
以下は、この問題にアプローチするための非常にクリーンな方法を提供する、 Scalazライブラリのジッパーの実装を使用する、より高度なソリューションです。
import scalaz._, Scalaz._
"abcd".toList.toZipper.map(
_.cobind(z => (z.lefts.reverse ++ z.rights).mkString).toList
)
これは を返しSome(List(bcd, acd, abd, abc))
ます。ここで、オプションのラッパーは空のジッパーが意味をなさないという事実を表します。実際、空の文字列から「1つを除外する」ことも意味がないため、ソリューションを同じ方法でモデル化することをお勧めします (より一般的なものにする場合)。
気にせず、空の文字列が空のリストになるようにしたい場合は、getOrElse Nil
ここに追加できます。
コレクション ライブラリは、次のことを行うのに最適な場所です。
def characterCombinations(word: String) = word
.distinct.combinations(word.distinct.length - 1).toList
characterCombinations("abcdaaaaaa") // outputs List(abc, abd, acd, bcd)
単語はIndexedSeq[Char]
、通常のコレクション メソッドを持つ に暗黙的に変換可能ですdistinct
。コレクション内の重複を削除し、コレクション内の長さcombinations(n)
の組み合わせを反復処理し、コレクションの長さを取得し、 を に変換します。n
length
toList
Iterator[String]
List[String]
最も簡単な方法は、String オブジェクトで Scala が提供する追加のメソッドを使用することです。
val word = "abcd"
word.combinations(3).toList
または、重複した文字を削除する場合:
word.distinct.combinations(3).toList
コメント後に更新 重複を削除したい場合は、上記の2番目の例を使用してください。あなたの例を完全に正確にするには:
val word = "abca"
word.distinct.combinations(word.distinct.length-1).toList
これは戻ります
res3: List[String] = List(ab, ac, bc)
ここにさらに別の解決策があります:
val word = "abcd"
(0 to 3) map (i => word.split(word(i)).foldLeft("")(_+_))