Scala: пропущенные записи в результате - PullRequest
1 голос
/ 21 апреля 2020

У меня есть следующий код Scala, который подсчитывает количество целых чисел в [0, 3000000) с количеством битов c для каждого возможного c.

(0 until 3000000)
  .map(java.lang.Integer.bitCount)
  .groupBy(x => x)
  .map(x => (x._2.length, x._1))
  .foreach(println)

Код выводит все правильно, за исключением того, что он не может вывести кортеж, соответствующий c = 0 . См. Ниже.

(413512,9)
(8086,17)
......
(23,20)
(278594,8)

Однако, если я изменю код, добавив фильтр после groupBy следующим образом:

(0 until 3000000)
  .map(java.lang.Integer.bitCount)
  .groupBy(x => x)
  .filter(_._1 == 0)
  .map(x => (x._2.length, x._1))
  .foreach(println)

, он сможет вывести кортеж (1, 0) .

Вопрос: Интересно, что здесь происходит? Кажется, что в первом фрагменте кода map не перечисляет все элементы в результате groupBy. Это ошибка библиотеки Scala?

1 Ответ

1 голос
/ 21 апреля 2020

У вас есть ключ и вы неверно оцениваете значение в новом Map. Попробуйте:

(0 until 3000000)
  .map(java.lang.Integer.bitCount)
  .groupBy(x => x)
  .map(x => (x._1, x._2.length)) // First value is key
  .foreach(println)

Это дает

  (0,1)
  (5,25177)
  (10,507620)
  (14,171443)
  (20,23)
  (1,22)
  (6,69632)
  (21,1)
  (9,413512)
  (13,301958)
  (2,230)
  (17,8086)
  (12,434968)
  (7,154357)
  (3,1520)
  (18,1699)
  (16,28666)
  (11,516450)
  (8,278594)
  (19,250)
  (4,7124)
  (15,78667)

Исходный сбой, поскольку (1, 0) был заменен на (1, 21)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...