我正在尝试为以下问题编写Java代码。但我无法找到解决此问题的优化方法。
我有一个咖啡的时间和消费数组列表,如下所示。我想计算每小时的咖啡消费量,如果特定小时没有消费,那么下一个小时首次进入将是该小时的总消费量。
例如:
我有以下数组列表
Time consumption of coffee
2:15 5 cups
2:30 6 cups
2:45 7 cups
3:05 2 cups
3:45 6 cups
5:05 1 cups
5:30 2 cups
7:15 1 cup
所以我想计算2小时的总消耗量,在这种情况下,从2:00到3:00将是18杯.3:00到4:00将是8杯。由于在4:00到5:00没有进入,在这种情况下消费量应该是5点05分消耗的咖啡量,即1杯。我想要我的结果直到7点钟。由于我们在6:00 -7:00没有任何东西,所以它将是1杯,价值为7:15。
所以我希望从每小时2:00到7:00的总消耗量的最终结果作为数组列表分发如下对象
obj1 = T<2:00,3:00,18>
obj2 = T<3:00,4:00,8>
obj3 = T<4:00,5:00,1>
obj4 = T<5:00,6:00,3>
obj5 = T<6:00,7:00,1>
finalList = <obj1,obj2,obj3,obj4,obj5>
我无法按小时方式查看列表并查看下一个值。
答案 0 :(得分:0)
你完全失去了关于用下一个小时的第一个值填充空小时的逻辑。但无论如何我会试一试。
我的方法假设您的输入数据从早期到晚期按时间顺序排列。
为您的两个值定义一个CoffeeConsumption
类,其中包含两个成员LocalTime
和Integer
。
创建Map
,或许SortedMap
,例如TreeMap
。键的类型为Integer
,表示从0到23的一天中的小时。值为Set
,可能是SortedSet
,例如TreeSet
来存储上面定义的自定义对象。
对于每个自定义对象,请抓取其LocalTime
并致电getHour
。使用该小时编号在Map中查找匹配的键,检索Set,然后添加项目。
要获得总计,请循环Map,然后循环每个Set。要保存总计,请创建一个新的SortedMap,其中Integer作为小时的键,Integer作为小时消耗的总杯数的值。
请注意,您无需明确保存问题中显示的结束时间。您始终可以计算该值:致电LocalTime::plusHours( 1 )
。
要支持first-first-item-to-previous-hour-if-empty功能,请遵循我在该带连字符的标题中概述的逻辑。将咖啡对象添加到地图时没有现有密钥但仍然在那里放置该时间,首先从小时中减去一个,然后在地图中查找该减去的数字作为关键字。如果减去的密钥不存在于地图中,则将其设置为创建一个新的空集,在该集合中存放咖啡对象,否则该咖啡对象将进入其自己的小时。警告:此功能有难闻的气味,并暗示您的设计出现问题或者要求被误解。