2017-08-14 49 views
0

我有一个2D阵列如下:滤波器使用多个元件阵列和逻辑运算符

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,假”

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

_3 = 0或1-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) 

没有人有任何想法为什么会出现这种错误?以及如何使用过滤器实现简单的逻辑操作?

提前非常感谢

回答

0

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

对于_._3 != 0 || _._4它导致编译器推断第二种类型的混淆。由于抛出编译,编译器试图转换:

_._3 != 0 || _._4 

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

x$2,该编译不能推断出这一点,所以这个编译器错误抛出。

+0

修复是正确的,但我仍然略有不同意的解释。每个函数参数必须使用'_'一次,并且只需使用一次。因此,写'_._ 3!= 0 || _._ 4',编译器将创建一个期望两个参数的函数。它与'i => i._3!= 0 ||非常不同i._4'这显然是一个只需要一个参数的函数。 –

+0

Hi @FredericA。,正如你所说的:“必须为每个函数参数使用一次和一次。”所以'_'应当用作**最小**上下文,当使用'_._ 3!= 0 ||时在这种情况下,这会造成编译器的混乱。 – chengpohi

+0

非常感谢您的帮助和解释:-) –