Применение функции фильтра к массиву массивов возвращает исключение в Scala - PullRequest
0 голосов
/ 09 октября 2018

Я изучаю Scala и попробовал отработать несколько примеров на Arrays.Ниже приведен пример:

  scala>var arr = Array(Array(1,2,3), Array(4,5,6));

  scala>arr.map(_.map(_ * 5))
  res42: Array[Array[Int]] = Array(Array(5,10,15),Array(20,25,30))

Когда я попытался выполнить метод filter для вышеупомянутого массива таким же образом, это привело к error.Ниже приведен фрагмент кода и полученный error.

   scala>arr.filter(_.filter(_ < 5))
   <console>:15: error: type mismatch;
   found   : Array[Int]
   required: Boolean
   o.filter(_.filter(_ < 5))
                    ^

Скажите, пожалуйста, почему не работает операция filter. Как правильно использовать метод filter в массиве массивов?

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Посмотрите на сигнатуру фильтра:

def filter(p: A => Boolean): Repr = filterImpl(p, isFlipped = false)

Метод фильтра принимает Предикат .Вы можете отобразить свои внутренние массивы, а затем отфильтровать по вашим правилам.

0 голосов
/ 09 октября 2018

Прежде всего, вы должны прочитать хорошую книгу, если вы заинтересованы в Scala.Использование vars - очень плохая практика, и новички должны ее избегать.

Что касается вашего примера, просто чтобы объяснить, почему он не работает, фильтр требует в качестве параметра функцию с типом возврата Boolean.Во внутреннем фильтре вы правильно используете _ < 5, который расширен до (x: Int) => x < 5, функцию, которая возвращает true или false.Но на внешнем фильтре вы использовали _.filter(_ < 5), который расширен до (y: Array[Int]) => y.filter((x: Int) => x < 5).В этом случае y.filter((x: Int) => x < 5) вернет новый массив, что означает, что функция имеет не тип возврата Boolean, а Array[Int].

0 голосов
/ 09 октября 2018

Если целью является получение Array(Array(1,2,3), Array(4)), то

arr.map(_.filter(_ < 5))

Если целью является получение Array(1,2,3,4), то

arr.flatten.filter(_ < 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...