【问题标题】:Match more than one element in collection匹配集合中的多个元素
【发布时间】:2012-11-24 06:37:56
【问题描述】:

定义:

val x = List(1, 2, 3, 4)

我想查找x 是否包含13。 一种方法是

x.contains(1) || x.contains(3)

另一个是

x.exists(y => y == 1 || y == 3)

另一个是:

x.exists(List(1,3).contains(_))

我更喜欢类似于

的东西
x.containsAnyOf(1, 3)

请注意,x.containsSlice 在这种情况下不起作用。

有没有更好的解决方案?

【问题讨论】:

    标签: scala scala-2.9


    【解决方案1】:

    你可以的

    x exists Set(0, 1, 2)
    

    【讨论】:

    • x exists (0 to 2).toSet(大范围首选)
    • @4e6:我的问题不是Set(1, 3)。我只在13 时寻找匹配项。另外,为什么0
    【解决方案2】:

    当然,Scala 的标准库中没有containsAnyOf。您可以使用“pimp my library”模式使其看起来像存在。

    class ContainsAnyOf[T](seq: Seq[T]) {
      def containsAnyOf(xs: T*) = seq.exists(xs.contains(_))
    }
    
    implicit def seqToContainsAnyOf[T](seq: Seq[T]) = new ContainsAnyOf(seq)
    

    现在你可以这样做了:

    scala> val a = List(1,2,3,4)
    a: List[Int] = List(1, 2, 3, 4)
    
    scala> a.containsAnyOf(1,3)
    res0: Boolean = true
    

    【讨论】:

    • 我笑“拉皮条我的图书馆”,然后发现你不是在开玩笑!
    • @PlastyGrove 已经尝试将模式的名称更改为“扩展我的库”或“丰富我的库”(请参阅​​:stackoverflow.com/tags/pimp-my-library/info),但我不确定是否有任何他们已经达到了原名的受欢迎程度.. :)
    • @PaoloFalabella:嗯,我明白为什么会推荐它,但是“Pimp my library”听起来很糟糕:)。更是如此,因为 Martin Odersky 也使用了它(artima.com/weblogs/viewpost.jsp?thread=179766)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    相关资源
    最近更新 更多