2

この質問を定義するのに苦労しています。私はこのようなことをしたい:

val list = List(("a",1), ("b",2))

private def shiftIndex[C <: Seq[_]](seq: C, amount: Int): C = {
  seq.map({ case (value, integer) => (value, integer + amount) })
}

shiftIndex(list,3) 

戻る必要があります

List(("a",4),("b",5)): List[String,Integer]

ただし、最も一般的なケースでは機能するはずです。

  1. seqはマップを実装します(私はそれが:Seqではないことを知っています)
  2. seqは、任意のタプルとIntを格納しています。

これらの概念を説明するリソースへのリンクをいただければ幸いです。

4

1 に答える 1

5
import scala.collection.generic.CanBuildFrom
import scala.collection.GenTraversable
import scala.collection.GenTraversableLike

def shiftIndex[T, Repr](seq: GenTraversableLike[(T, Int), Repr], amount: Int)(
    implicit bf: CanBuildFrom[Repr, (T, Int), Repr]) = {
  seq.map { case (value, integer) => (value, integer + amount) }
}

shiftIndex(List(("a", 1), ("b", 2)), 3)     // List((a,4), (b,5))
shiftIndex(Set(("a", 1), ("b", 2)), 3)      // Set((a,4), (b,5))
shiftIndex(Map(("a", 1), ("b", 2)), 3)      // Map(a -> 4, b -> 5)

見栄えが良く、より一般的なソリューションをお勧めするかもしれませんが。ここでは、GenTraversableを強化して、ペアのすべてのトラバース可能なオブジェクトが、ペアの2番目の部分に適用される関数を受け取るメソッドmapVals持ち、実行されたオブジェクトと同じ戻り型を持つようにします。

class EnrichedWithMapVals[T, U, Repr](seq: GenTraversableLike[(T, U), Repr]) {
  def mapVals[R, That](f: U => R)(implicit bf: CanBuildFrom[Repr, (T, R), That]) = {
    seq.map { case (x, y) => (x, f(y)) }
  }
}
implicit def enrichWithMapVals[T, U, Repr](self: GenTraversableLike[(T, U), Repr]) = new EnrichedWithMapVals(self)

List(("a", 1), ("b", 2)).mapVals(_ + 3)     // List((a,4), (b,5))
Set(("a", 1), ("b", 2)).mapVals(_ + 3)      // Set((a,4), (b,5))
Map(("a", 1), ("b", 2)).mapVals(_ + 3)      // Map(a -> 4, b -> 5)
于 2013-01-12T23:21:00.083 に答える