【问题标题】:filter an Array using multiple elements and a logical operator使用多个元素和逻辑运算符过滤数组
【发布时间】:2017-08-14 09:32:25
【问题描述】:

我有一个二维数组如下:

scala> testme4
res15: Array[(java.sql.Timestamp, Int, Int, Boolean)] 
   = Array((2016-11-17 15:18:50.47,13,-8,false), 
           (2016-11-17 15:18:51.37,21,-1,false), 
           (2016-11-17 15:18:51.37,22,-1,false), 
           (2016-11-17 15:18:51.86,23,-1,false), 
           (2016-11-17 15:18:52.3,24,22,false), 
           (2016-11-17 15:18:52.37,2,-2,false), 
           (2016-11-17 15:18:54.2,4,-1,false), 
           (2016-11-17 15:18:54.2,5,-7,false), 
           (2016-11-17 15:20:57.27,12,-4,false), 
           (2016-11-17 15:20:57.67,16,-1,false), 
           (2016-11-17 15:20:57.67,17,-9,false), 
           (2016-11-17 15:20:58.3,26,0,false), 
           (2016-11-17 15:20:59.35,26,0,true)
       )

我希望选择(过滤器)来获取除“2016-11-17 15:20:58.3,26,0,false”之外的所有元素

我需要使用每个元素的第三和第四个子元素...通过过滤(伪代码)来做到这一点:

_3 != 0 或 _4==true

这两个谓词在各自的过滤器中工作正常:

scala> testme4.filter(_._3 != 0 ) 
res16: Array[(java.sql.Timestamp, Int, Int, Boolean)] 
   = Array((2016-11-17 15:18:50.47,13,-8,false),
           (2016-11-17 15:18:51.37,21,-1,false),
           (2016-11-17 15:18:51.37,22,-1,false), 
           (2016-11-17 15:18:51.86,23,-1,false), 
           (2016-11-17 15:18:52.3,24,22,false), 
           (2016-11-17 15:18:52.37,2,-2,false), 
           (2016-11-17 15:18:54.2,4,-1,false), 
           (2016-11-17 15:18:54.2,5,-7,false), 
           (2016-11-17 15:20:57.27,12,-4,false), 
           (2016-11-17 15:20:57.67,16,-1,false), 
           (2016-11-17 15:20:57.67,17,-9,false)
       )

或者..

scala> testme4.filter(_._4) 
res17: Array[(java.sql.Timestamp, Int, Int, Boolean)] 
        = Array((2016-11-17 15:20:59.35,26,0,true))

但如果我尝试将它们与逻辑运算符结合起来,我会得到一个错误:

scala> testme4.filter(_._3 != 0 || _._4) 
<console>:38: error: missing parameter type for expanded function ((x$1, x$2) => x$1._3.$bang$eq(0).$bar$bar(x$2._4))
   testme4.filter(_._3 != 0 || _._4)

有人知道为什么会出现这个错误吗?以及如何使用过滤器实现简单的逻辑运算?

提前致谢

【问题讨论】:

    标签: arrays scala filter


    【解决方案1】:

    你应该使用testme4.filter(i =&gt; i._3 != 0 || i._4)

    对于_._3 != 0 || _._4,它会导致 compiler 混淆来推断第二种类型。作为编译器抛出,编译器正在尝试转换:

    _._3 != 0 || _._4
    

    ((x$1, x$2) => x$1._3.$bang$eq(0).$bar$bar(x$2._4))
    

    对于x$2编译器无法推断,所以抛出了这个编译器错误

    【讨论】:

    • 修复是正确的,但我还是有点不同意这个解释。对于每个函数参数,_ 必须使用一次且仅使用一次。因此,编写_._3 != 0 || _._4,编译器将创建一个需要两个参数的函数。它与i =&gt; i._3 != 0 || i._4 非常不同,i =&gt; i._3 != 0 || i._4 显然是一个只需要一个参数的函数。
    • 您好@FredericA.,正如您所说:“_ 必须为每个函数参数使用一次且恰好一次。”所以 _ 应该用作 minimum 上下文,当在上下文中使用 _._3 != 0 || _._4 this 时,会导致编译器混淆。
    • 非常感谢您的帮助和解释 :-)
    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多