我的下面是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))
}
我觉得这个循环会消耗比所需更多的时间,有没有更好的练习/方法来做到这一点,任何更好的代码?感谢。
答案 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"
。