2017-09-12 4 views
-1

私はScalaには新しく、リストの1つのメンバーで関数を実行しようとしています。それは私が私がlist.map(_.split(" "))を実行する場合、私はScala:リストの1つのメンバーにのみ関数を実行します。

になるだろうことを知っているval list = List("hi", "bye now", "see", "ya", "later")

のように見えるのリストを返したい val list = List("hi", "bye now", "see ya later")

のように見えるのリストを与えています list = ("hi", "bye", "now", "see", "ya", "later")。だから、単にlamdasを使ってこれをやります。

list.append(list(2).split(" "))list.remove(list(2))

事前のおかげで、

+2

リストの1つの要素に対してのみ関数を実行したい場合は、 'map'を強制的に使用するのは、' righ 'ではありません答え。あなたの最後の方法は、おそらく最も簡単です。 – Carcigenicate

+4

あなたのこの機能は、「リストの3番目の要素を分割する」、「リストの長さが最も長い要素を分割する」、「参照して開始する要素を分割する」、「最も大きくなる要素を分割するサブ要素 "など?いずれかの人が喜んであなたの 'list'をとり、望みの結果を返すでしょうが、あなたはあなたの問題をうまく説明していません。なぜ特定の要素分割が必要なのですか?それが単に「3番目の要素を分割する」場合、最後の行に書いたものは完全にうまくいくようです。 – slouc

+0

すべてを分割した後に文字列のリストを取得するには 'map'ではなく' split'で 'flatMap'を実行しなければなりません。 – michaJlS

答えて

1

あなただけのリスト内の特定のエントリに関数を適用する上で意図している場合は、可能性:

list.zipWithIndex.flatMap { 
    case (entry, idx) if (idx == 2) => 
    entry.split(" ") 
    case (entry, idx) => List(entry) 
} 

これはでもう少し一般化することができ

// Add variance, curry, etc. as needed... 
def flatMapOnly[A](list: List[A], offsets: Set[Int], f: A => Seq[A]): List[A] = 
    list.zipWithIndex.flatMap { 
    case (entry, idx) if (offsets.contains(idx)) => 
     f(entry) 
    case (entry, _) => List(entry) 
    } 

scala> flatMapOnly(List("hi", "bye", "see ya later"), Set(1, 2), { str: String => str.split(" ").toList }) 
res39: List[String] = List(hi, bye, see, ya, later) 
関連する問題