我们有特定号码的区块。日期范围,并要求合并每个重叠的块的日期范围,并添加它们的总数量。
考虑以下给定的输入和所需的输出:
Block 1 -
14/11/2016 - 17/11/2016 ===> 100
18/11/2016 - 20/11/2016 ===> 200
Block 2 -
15/11/2016 - 16/11/2016 ===> 50
17/11/2016 - 20/11/2016 ===> 300
Block 3 -
15/11/2016 - 18/11/2016 ===> 100
19/11/2016 - 20/11/2016 ===> 400
14/11/2016 ===> 100
15/11/2016 - 16/11/2016 ===> 250
17/11/2016 ===> 500
18/11/2016 ===> 600
19/11/2016 - 20/11/2016 ===> 900
请问您是否有任何java实用程序可以处理这种复杂性。
答案 0 :(得分:2)
实用程序未知,但您可以使用整数数组计算答案,其中数组索引的数据表示是每天从起点开始的偏移量,然后迭代每个范围并递增值进入数组的相应索引的范围,然后当您完成时,每个索引表示开始日期的偏移日期,值是块中范围的累计值。然后,如果您希望再次使用范围表示输出,则可以逐步浏览内容并根据连续匹配值声明范围的起点和终点。
set start date = day of first entry of first block
for each block
for each range
for each day of range
offset = day-of-range - start-date
array[offset] += rangeValue
想象一下将时间线堆叠在一起,然后让它们全部投射到一组共同的离散持有者中,这些持有者会聚集每个持有者的价值。
new range(start date, start date)
range-value = array[0]
for each index in array
if array[index] == array[index-1]
range-end = startdate+index
else
new range(startdate+index, startdate+index)
range-value = array[index]
不考虑开始或错误陷阱的索引边界。它可能不是最优雅的解决方案,但它应该可以解决您的问题。