我的循环时间很长

时间:2018-03-10 20:40:20

标签: kotlin

我的下面是data structure,其中包括交易日期和数量,以及day stamp以毫秒为单位

data class transaction (var date: LocalDate, var quantity: Double) {

    private var calendar: Calendar =
            GregorianCalendar(date.year, (date.monthValue + 1), date.dayOfMonth)

    var day_stamp: Long = calendar.timeInMillis
}

以上用于定义2个变量数组:

var salesOrders = ArrayList<transaction>()
var demand = ArrayList<transaction>()

sales Orders数组由以下人员创建:

val formatter: DateTimeFormatter
    get() = DateTimeFormatter.ofPattern("dd.mm.yyyy", Locale.ENGLISH)

salesOrders.add(transaction(LocalDate.parse("01.02.2018", formatter), 100.0))
salesOrders.add(transaction(LocalDate.parse("01.02.2018", formatter), 80.0))
salesOrders.add(transaction(LocalDate.parse("02.02.2018", formatter), 120.0))
salesOrders.add(transaction(LocalDate.parse("02.02.2018", formatter), 90.0))

如图所示,我们可能在同一天需要多个销售订单,我需要将每天所需数量的总和放在每天显示的demand数组中,以及总数销售订单数量,为此,我使用day stamp作为参考Considering a day is of: 24 hrs * 60 min/hour * 60,000 millisecond/min = 86,400,000 millisecond并使用以下代码:

for (i in 1519862400000..1519862400000 step 86400000){

    var calendar: Calendar = Calendar.getInstance()

    calendar.setTimeInMillis(i);

    val mYear: Int = calendar.get(Calendar.YEAR)

    val mMonth: Int = calendar.get(Calendar.MONTH)

    val mDay: Int = calendar.get(Calendar.DAY_OF_MONTH)

    val acc = salesOrders.filter { it.day_stamp == i }.
            fold (0.0) {s, els -> s.plus(els.quantity) }

    demand.add(transaction(LocalDate.of(mDay, mMonth, mYear),acc))
}

我觉得这个循环会消耗比所需更多的时间,有没有更好的练习/方法来做到这一点,任何更好的代码?感谢。

1 个答案:

答案 0 :(得分:3)

以下将满足您的需求:

val demand = salesOrders.groupingBy { it.date }.fold(0.0) { sum: Double, t: transaction ->
    sum + t.quantity
}.map { transaction(it.key, it.value) }

在汇总所有数量并再次映射到新的salesOrders个实例之前,输入transaction将按日期分组。

请注意,您的格式化程序未按预期工作:更改为"dd.MM.yyyy"