Как создать список BigDecimals в Kotlin без цикла? - PullRequest
0 голосов
/ 29 августа 2018

Допустим, я хочу создать список больших десятичных чисел в Kotlin

[ 0.0, 0.1 .. 9.9 ]

Как я могу достичь следующего без цикла?

val numbers: List<BigDecimal> = generateNumbers()

fun generateNumbers(): List<BigDecimal> {
    val list = ArrayList<BigDecimal>()
    for (i in 0..9)
        (0..9).mapTo(list) { BigDecimal("$i.$it") }

    return list
}

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Если вы знаете, сколько вы хотите добавить за шаг (например, 0.1), вы также можете использовать generateSequence вместо:

val yourSequence = generateSequence(BigDecimal.ZERO) { 
    it + BigDecimal("0.1")
}.takeWhile { it < BigDecimal.TEN }

После этого вы можете назвать что-то вроде yourSequence.forEach(::println), если хотите.

Если вы хотите вместо этого бесконечную последовательность, просто пропустите takeWhile, например, достаточно:

generateSequence(BigDecimal.ZERO) { 
    it + BigDecimal("0.1")
}

Применение его к функции («отформатированной» так, что все сразу видно):

fun generateNumbers(from: BigDecimal = BigDecimal.ZERO,
                    uptoExclusive: BigDecimal = BigDecimal.TEN,
                    step: BigDecimal = BigDecimal("0.1")
                    ) = generateSequence(from) {  it + step }
                            .takeWhile { it < uptoExclusive }

Пример использования:

generateNumbers().forEach(::println)
generateNumbers(BigDecimal.ONE, step = BigDecimal.ONE).forEach(::println)
0 голосов
/ 30 августа 2018

Другой способ создать требуемый список BigDecimals, когда вы заранее знаете количество элементов и индекс отображения формулы на элемент, следующий:

val numbers = List(100) { index -> BigDecimal(index).scaleByPowerOfTen(-1) }

Здесь мы создаем список из 100 элементов, где каждый элемент получен из его индекса (который находится в диапазоне 0 ... 99), масштабируемого на 10 -1 .

0 голосов
/ 29 августа 2018

Вы также можете сделать это с помощью .flatMap { ... }, который объединяет полученные списки в один:

fun generateNumbers(): List<BigDecimal> = 
    (0..9).flatMap { i -> 
        (0..9).map { 
            BigDecimal("$i.$it") 
        } 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...