2015-06-05 71 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