实施不同类型的价格矩阵

时间:2018-09-20 11:48:30

标签: algorithm design-patterns kotlin

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

在我的应用中,我有一些会员类型。我想提前计算以上所有可能的价格组合,并针对每个成员将其显示在一个对象中。

假设用户选择了金牌会员身份,我希望计算出(价值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}

对于列表中的每种成员资格类型,提取值和费率并计算所有可能的组合。

黄金组合

        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 :(得分:1)

好吧,我不知道您到底需要什么计算逻辑。但我提供了示例,您如何做到这一点:

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])
    }
}