砍掉java数组列表

时间:2016-07-16 02:17:24

标签: java list arraylist

我正在尝试为以下问题编写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>

我无法按小时方式查看列表并查看下一个值。

1 个答案:

答案 0 :(得分:0)

你完全失去了关于用下一个小时的第一个值填充空小时的逻辑。但无论如何我会试一试。

我的方法假设您的输入数据从早期到晚期按时间顺序排列。

为您的两个值定义一个CoffeeConsumption类,其中包含两个成员LocalTimeInteger

创建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功能,请遵循我在该带连字符的标题中概述的逻辑。将咖啡对象添加到地图时没有现有密钥但仍然在那里放置该时间,首先从小时中减去一个,然后在地图中查找该减去的数字作为关键字。如果减去的密钥不存在于地图中,则将其设置为创建一个新的空集,在该集合中存放咖啡对象,否则该咖啡对象将进入其自己的小时。警告:此功能有难闻的气味,并暗示您的设计出现问题或者要求被误解。