2015-01-25 3 views
2

У меня есть данные в этой форме, это в основном огромные данные.Как проверить, являются ли все элементы в списке числовыми?

val data: Array[(Int, Iterable[String])] = 
    Array(
    (34,List("sdkfj",7, 2, 5, 3, 1, 9, 2, 1, 4)), 
    (4,List(7, 14, 4, 5, 11, 9, 5, 4, 1)) 
) 

Я хочу, чтобы применить функцию сказать isNumeric на итерацию пунктов, которые должны вернуть мне выход следующим образом

Array((34,false), (4,true)) 

В принципе, я хочу false, если любой элемент в списке не числовое, в противном случае true.

Я пробовал эту функцию

def isNumeric(input: String): Boolean = input.forall(_.isDigit) 

Но в этом случае я получаю список булевы а я хочу один логический результат для всего списка.

ответ

5

Вы должны вызвать .forall на внутреннем списке:

scala> def isNumeric(input: String): Boolean = input.forall(_.isDigit) 
isNumeric: (input: String)Boolean 

scala> val a:Array[(Int,List[String])] = Array((34,List("sdkfj","7", "2", "5", "3", "1", "9", "2", "1", "4")), (4,List("7", "14", "4", "5", "11", "9", "5", "4", "1"))) 
a: Array[(Int, List[String])] = Array((34,List(sdkfj, 7, 2, 5, 3, 1, 9, 2, 1, 4)), 
             (4, List(7, 14, 4, 5, 11, 9, 5, 4, 1))) 

scala> a.map { case (k, l) => (k, l.forall(isNumeric)) } 
res0: Array[(Int, Boolean)] = Array((34,false), (4,true)) 

EDIT

Если вы хотите, чтобы пропустить проверку для некоторых элементов, вы можете использовать .filter перед использованием .forall (запуска валидаций только в подвыписке):

scala> val a:Array[(Int,List[String])] = Array((34,List("NA","7", "3"))) 
a: Array[(Int, List[String])] = Array((34,List(NA, 7, 3))) 

// Not sure what an NA is, so... 
scala> def isNA(s:String) = s == "NA" 
isNA: (s: String)Boolean 

// Using .filterNot here since you want to exclude all `NA`s 
// You can also use .filter(!isNA(_)) 
// or .withFilter(!isNA(_)) which should be faster/more efficient 
scala> a.map{ case (k, l) => (k, l.filterNot(isNA).forall(isNumeric)) } 
res0: Array[(Int, Boolean)] = Array((34,true)) 

Обратите внимание, что вы купили ld также изменить метод .isNumeric на .isNumericOrNA (тем самым пропуская необходимость в filter), хотя это может быть немного запутанным, в зависимости от того, что такое NA.

NB: см. Scala API для объяснения различий между .filter и .withFilter.

+0

Спасибо Marth ... это работает нормально .. все неправильно, я делаю, использует карту вместо forall, которую вы упомянули ... в основном потому, что я новичок в scala ... также в моем наборе данных у меня есть NA, где значение отсутствует ... Я хочу исключить сравнение для NA. Можно ли добавить фильтр внутри forall так, чтобы он пропускал isNumeric на NA? –

+0

@ KundanKumar: Отредактировал мой ответ. – Marth

+1

Спасибо большое Marth !! –

Смежные вопросы