Вы должны вызвать .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
.
Спасибо Marth ... это работает нормально .. все неправильно, я делаю, использует карту вместо forall, которую вы упомянули ... в основном потому, что я новичок в scala ... также в моем наборе данных у меня есть NA, где значение отсутствует ... Я хочу исключить сравнение для NA. Можно ли добавить фильтр внутри forall так, чтобы он пропускал isNumeric на NA? –
@ KundanKumar: Отредактировал мой ответ. – Marth
Спасибо большое Marth !! –