Как вычислить произведение кодов Unicode всех букв в строке с помощью цикла for? - PullRequest
1 голос
/ 01 марта 2012

Я придумал это решение, но оно использует переменную:

var prod = 1
for (i <- "Hello"){ prod *= i.toInt }; println(prod)

Как бы вы подошли к этой проблеме, если бы вам пришлось использовать цикл for?

Ответы [ 8 ]

4 голосов
/ 01 марта 2012

Вы не используете для понимания для этого. Да, для циклов, которые являются обязательными конструкциями, можно использовать, но в этом случае вы будете использовать .

Объяснение: для понимания - это то, что превращает M[A] в M[B]. Для String M будет Seq (или, возможно, IndexedSeq), а Seq не является Int, а также Int не параметризовано.

Для такого рода задач вы должны использовать foldLeft или foldRight. Эти конструкции могут полностью преобразовать M[A] во что-то другое. См. Также сущность шаблона итератора , который обеспечивает более общее решение (и всякий раз, когда вы читаете «общие», думайте, что «требуется дополнительная настройка»).

Конечно, самый простой способ - "Hello".product.toInt.

3 голосов
/ 01 марта 2012

Используйте BigInt, потому что Int переполнится.

"Hello" map (i => BigInt(i)) product

Или, если вы настаиваете на цикле for, как насчет этого:)

object Product { 
  def unapply[T: Numeric](xs: Seq[T]) = Some(xs.product) 
}

val Product(prod) = for(i <- "Hello") yield BigInt(i)

// prod: scala.math.BigInt = 9415087488
2 голосов
/ 08 сентября 2013

Самое короткое правильное решение:

"Hello".map(BigInt(_)).product

, что дает ожидаемое значение в книге

9415087488
1 голос
/ 01 марта 2012

На самом деле есть метод product:

scala> "Hello".map(_.toInt).product
res0: Int = 825152896

Если вам действительно нужно ключевое слово for в своем решении, вы можете сделать это:

scala> (for(c <- "Hello") yield c.toInt).product
res1: Int = 825152896

Это технически имеет цикл for, но на самом деле это просто синтаксический сахар для предыдущей вещи, которая использует map.

1 голос
/ 01 марта 2012

Как насчет этого?

"Hello".foldLeft(1L)(_ * _)

В качестве альтернативы:

(1L /: "Hello")(_ * _)
0 голосов
/ 23 ноября 2014

На странице 20 этой книги в примечании упоминается, что вы можете обернуть генераторы цикла for в фигурные скобки.

Итак, это:

{ for(i <- "hello") yield BigInt(i) }

Возвращает:

Vector(104, 101, 108, 108, 111)

который вы могли бы назвать продуктом:

 { for(i <- "hello") yield BigInt(i) }.product

 // returns:  scala.math.BigInt = 13599570816

Надеюсь, это поможет.

0 голосов
/ 01 марта 2012

Если вам действительно нужно использовать цикл for и вы хотите, чтобы цикл for действительно выполнял свою работу, я думаю, что ваше решение в порядке.

0 голосов
/ 01 марта 2012
"Hello".map( _.toInt).reduce(_ * _)

или

"Hello".foldLeft(1)(_ * _)

Вдохновлено решением Жана-Филиппа Пелле, которое вызывает

type mismatch;
found   : Int
required: Char

По крайней мере в моей Eclipse IDE

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