Реализация матрицы цен для разных типов - PullRequest
0 голосов
/ 20 сентября 2018
Membership      || interest rate
Gold            || 0.12, 0.20, 0.3
Silver          || 0.13, 0.24, 0.3
Bronze          || 10.1, 0.2, 0.3

Membership      || value rate
Gold            || 10, 20, 30
Silver          || 10, 50, 40

В моем приложении есть несколько типов членства.Я хочу заранее рассчитать все возможные ценовые комбинации из вышеперечисленных и представить по одному объекту для каждого членства.

Допустим, пользователь выбирает членство Gold, я рассчитываю рассчитать каждую комбинацию (значение x процентная ставка) и представить пользователю в каком-либо объекте.

Какя могу реализовать это и какие структуры данных, дизайн я могу использовать?

Пользователь может выбрать несколько членств, если он пожелает, и в этом случае он должен представить все комбинации значения / ставки для обоих членств.

У меня есть что-то вроде этого, например:

sealed class MembershipType(val label: String) {

    abstract val interestRates: List<BigDecimal>
    abstract val valueOptions: List<BigDecimal>


    object SILVER : MembershipType("Silver") {

        override val valueOptions: List<BigDecimal> =
                listOf<BigDecimal>(
                        BigDecimal.valueOf(10),
                        BigDecimal.valueOf(50),
                        BigDecimal.valueOf(40))
    }...

У меня есть функция, которая получает список следующим образом:

fun calculateQuote(score: Int, memberShipSelected: List<MembershipType>): Quote {//TODO}

Для каждого типа членства в списке извлеките значение и коэффициент и рассчитайте все возможные комбинации.

Комбинации для GOLD

        rates
Values   0.12       0.20            0.3
10      10*0.12     10*0.20         10*0.3
20      20*0.12     20*0.20         20*0.3
30      30*0.12     30*0.20         30*0.3

1 Ответ

0 голосов
/ 20 сентября 2018

Хорошо, я не знаю, какая именно логика расчета вам нужна.Но я привожу пример, как вы можете это сделать:

data class Result(val value: BigDecimal, val rate: BigDecimal, val result: BigDecimal)

sealed class Membership {

    abstract val interestRates: List<BigDecimal>
    abstract val valueOptions: List<BigDecimal>

    fun calcCombinations() = this.valueOptions.map { vo ->
        this.interestRates.map {
            Result(vo, it, vo * it)
        }
    }

    object SILVER : Membership() {
        override val interestRates = listOf(BigDecimal("0.13"), BigDecimal("0.24"), BigDecimal("0.3"))

        override val valueOptions = listOf(BigDecimal(10), BigDecimal(50), BigDecimal(40))
    }

    object GOLD : Membership() {

        override val interestRates = listOf(BigDecimal("0.12"), BigDecimal("0.2"), BigDecimal("0.3"))

        override val valueOptions = listOf(BigDecimal(10), BigDecimal(20), BigDecimal(30))
    }
}

object Main {

    @JvmStatic
    fun main(args: Array<String>) {
        println(GOLD.calcCombinations())
        println(SILVER.calcCombinations())

        val membershipToCombinations = setOf(GOLD, SILVER).associateBy({
            it
        }, {
            it.calcCombinations()
        })

        println(membershipToCombinations[SILVER])
        println(membershipToCombinations[GOLD])
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...