将某个元素的每次出现替换为其他元素

发布于 2024-10-01 23:12:34 字数 162 浏览 3 评论 0原文

将某个列表中每次出现的元素 x 替换为其他元素 y 的最佳 Scala 方法是什么?这就是我现在正在做的事情:

list map { 
  case `x` => y
  case a => a
}

是否有更简洁的方法可用?谢谢。

What is the best Scala way to replace from some list every occurrence of element x by some other element y? This is what I am doing right now:

list map { 
  case `x` => y
  case a => a
}

Is there more concise way available? Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

榆西 2024-10-08 23:12:34
list.map(i => if (i==x) y else i)

这个怎么样?

list.map(i => if (i==x) y else i)

how about this?

酷炫老祖宗 2024-10-08 23:12:34

如果您需要经常这样做,您可以编写一个实用函数:

def replace[T](x: T, y: T) = (i: T) => if (i == x) y else i

这将允许您编写

list map replace(x, y)

Or,对于中缀语法:

class ReplaceWith[T](x: T) {
   def replaceWith(y: T) = (i: T) => if (i == x) y else i
}
object ReplaceWith {
   implicit def any2replaceWith[T](x: T) = new ReplaceWith(x)
}

// now you can write
list map (x replaceWith y)

另一种解决方案是使用 Map:

list map Map(x -> y).withDefault(identity)

使用实用函数:

scala> def replace[T](pairs: (T, T)*) = Map(pairs: _*).withDefault(identity)
replace: [T](pairs: (T, T)*)scala.collection.immutable.Map[T,T]

scala> List(1,2,3) map replace(1 -> -1, 3 -> 4)
res0: List[Int] = List(-1, 2, 4)

If you need to do this a lot, you might write a utility function:

def replace[T](x: T, y: T) = (i: T) => if (i == x) y else i

This would allow you to write

list map replace(x, y)

Or, for infix syntax:

class ReplaceWith[T](x: T) {
   def replaceWith(y: T) = (i: T) => if (i == x) y else i
}
object ReplaceWith {
   implicit def any2replaceWith[T](x: T) = new ReplaceWith(x)
}

// now you can write
list map (x replaceWith y)

Another solution is to use a Map:

list map Map(x -> y).withDefault(identity)

With a utility function:

scala> def replace[T](pairs: (T, T)*) = Map(pairs: _*).withDefault(identity)
replace: [T](pairs: (T, T)*)scala.collection.immutable.Map[T,T]

scala> List(1,2,3) map replace(1 -> -1, 3 -> 4)
res0: List[Int] = List(-1, 2, 4)
新人笑 2024-10-08 23:12:34

您可以创建自定义方法来替换:

class RichIterable[E] (col: Iterable[E]) {
    def replace(pairs: (E, E)*): Iterable[E] = col map {
        a => pairs.find(_._1 == a) match {
            case None => a
            case Some(p) => p._2
        }
    }
}

object RichIterable {
    implicit def iterable2RichIterable[A](col: Iterable[A]) = 
        new RichIterable(col)
}

然后替换元素应该很容易:

scala> import RichIterable._
import RichIterable._
scala> List(1, 2, 3, 4, 5, 4, 3, 4, 7).replace(3 -> 30, 4 -> 40)
res1: Iterable[Int] = List(1, 2, 30, 40, 5, 40, 30, 40, 7)

You can create custom method for replacing:

class RichIterable[E] (col: Iterable[E]) {
    def replace(pairs: (E, E)*): Iterable[E] = col map {
        a => pairs.find(_._1 == a) match {
            case None => a
            case Some(p) => p._2
        }
    }
}

object RichIterable {
    implicit def iterable2RichIterable[A](col: Iterable[A]) = 
        new RichIterable(col)
}

Replacing elements should then be easy:

scala> import RichIterable._
import RichIterable._
scala> List(1, 2, 3, 4, 5, 4, 3, 4, 7).replace(3 -> 30, 4 -> 40)
res1: Iterable[Int] = List(1, 2, 30, 40, 5, 40, 30, 40, 7)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文