2

私はまだscalaを学んでいます。一言あれば

val word = "abcd"

作成したい

Map("bcd","acd","abd","abc")

はるかに私が試した:

  println(word.map(word.split(_).foldLeft("")(_+_)))

しかし、単語に char が重複していると失敗します。

助けてください。

4

5 に答える 5

8

これは必ずしも最も効率的なアプローチではありませんが、initsandtailsメソッドを使用してこれをかなりきれいに行うことができます。おそらく「機能的ではない」インデックスを処理する必要はありません。

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ここに追加できます。

于 2013-09-15T17:44:48.167 に答える
1

コレクション ライブラリは、次のことを行うのに最適な場所です。

 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)の組み合わせを反復処理し、コレクションの長さを取得し、 を に変換します。nlengthtoListIterator[String]List[String]

于 2013-09-15T19:04:42.530 に答える
1

最も簡単な方法は、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)
于 2013-09-15T16:24:20.770 に答える
0

ここにさらに別の解決策があります:

val word = "abcd" 
(0 to 3) map (i => word.split(word(i)).foldLeft("")(_+_))
于 2013-09-16T17:21:14.883 に答える