2015-06-05 39 views
0

我有以下功能:Scala的功能筛选字段只数

def isAllDigits(x: String) = x forall Character.isDigit 

    def filterNum(x: (Int, String)) : Boolean = { 
    accumNum.add(1) 
    if(isAllDigits(x._2)) false 
    else true 
    } 

我传递键/值的,我要检查值是数值。出于某种原因,它被过滤掉:

res10: Array[(Int, String)] = Array((1,18964), (2,39612), (3,1), (4,""), (5,""), (6,""), (7,""), (8,""), (9,1), (10,"")) 

,但允许这样的:

res9: Array[(Int, String)] = Array((18,1000.0), (22,23.99), (18,1001.0), (22,23.99), (18,300.0), (22,23.99), (18,300.0), (22,23.99), (18,300.0), (22,23.99)) 

不.isDigit只允许双打?但是我很困惑,为什么当x是(Int,String)被传入的double/int被看作是一个字符串。

编辑: 我使用这个功能在星火下列要求:

val numFilterRDD = numRDD.filter(filterNum) 

numRDD.take()例如:

res11: Array[(Int, String)] = Array((1,18964), (2,39612), (3,1), (4,""), (5,""), (6,""), (7,""), (8,""), (9,1), (10,""), (11,""), (16,""), (18,1000.0), (19,""), (20,""), (21,""), (22,23.99), (23,""), (24,""), (25,"")) 
+0

你能提供一些你如何使用这个filterNum函数的例子吗? – leshkin

+0

我不知道这是否只是一个错字,但注意到res10的元素不是类型(Int,String),而是(Any,String)。这甚至不应该编译。 – abalcerek

+0

增加了额外的上下文。 – theMadKing

回答

1

的问题是,你是通过每个角色单独运行。因此,在双的情况下,它就会到小数点检查点,并且本身不是一个数字:

Character.isDigit('.') //false 

您可能会更好使用正则表达式。

x matches """^\d+(\.?\d+)$""" 
+0

谢谢,正则表达式对于我所要做的事情有点不合适,但是这里是为我工作的:def isAllDigits(x:String)= x匹配“”“^ \ d {1,} \。* \ d * $” “” – theMadKing