LINUX.ORG.RU

История изменений

Исправление FilosofeM, (текущая версия) :

Перегрузку операторов не завезли? Закапывайте!

В Котлине давным давно завезли. Я лично реализовал векторную арифметику на Котлине.

internal operator fun Array<BigDecimal>.plus(other: Array<BigDecimal>) = this.arithmetic(other) { x, y ->
    x + y
}

internal operator fun Array<BigDecimal>.minus(other: Array<BigDecimal>) = this.arithmetic(other) { x, y ->
    x - y
}

private fun Array<BigDecimal>.arithmetic(other: Array<BigDecimal>, operator: (BigDecimal, BigDecimal) -> BigDecimal): Array<BigDecimal> {
    return if (this.isNotEmpty() && other.isNotEmpty()) {
        val thisSize = this.size
        val otherSize = other.size
        val maxSize = maxOf(thisSize, otherSize)
        val result = Array<BigDecimal>(maxSize) {
            BigDecimal.ZERO
        }
        for (i in 0 until maxSize) {
            result[i] = operator(this[i % thisSize], other[i % otherSize])
        }
        result
    } else {
        emptyArray()
    }
}

object Main {
    
    @JvmStatic
    fun main(args: Array<String>) {
        val a = arrayOf(BigDecimal("0.5"), BigDecimal("0.6"), BigDecimal("0.7"))
        val b = arrayOf(BigDecimal("0.8"), BigDecimal("0.9"), BigDecimal("1.0"))
        println(Arrays.toString(a + b))
    }
}

Исходная версия FilosofeM, :

Перегрузку операторов не завезли? Закапывайте!

В Котлине давным давно завезли. Я лично реализовал векторную арифметику на Котлине.

internal operator fun Array<BigDecimal>.plus(other: Array<BigDecimal>) = this.arithmetic(other) { x, y ->
    x + y
}

internal operator fun Array<BigDecimal>.minus(other: Array<BigDecimal>) = this.arithmetic(other) { x, y ->
    x - y
}

private fun Array<BigDecimal>.arithmetic(other: Array<BigDecimal>, operator: (BigDecimal, BigDecimal) -> BigDecimal): Array<BigDecimal> {
    return if (this.isNotEmpty() && other.isNotEmpty()) {
        val thisSize = this.size
        val otherSize = other.size
        val maxSize = maxOf(thisSize, otherSize)
        val result = Array<BigDecimal>(maxSize) {
            BigDecimal.ZERO
        }
        for (i in 0 until maxSize) {
            result[i] = operator(this[i % thisSize], other[i % otherSize])
        }
        result
    } else {
        emptyArray()
    }
}