最近碰到一个查表的问题.需要通过表中的日期筛选出数据.数据可能是0到n.表中的日期是按照顺序排列的.使用二分查找遇到了只能查到指定项的问题的问题.下面是我的代码实现.
-- function UI_WeatherMain:Binary_Search(_CurDate)
-- if _CurDate ~= 0000 then
-- local _CureDateNum = tonumber(_CurDate)
-- local _start = 1
-- local _end = #TB_WEATHER_CONFIG
-- while _start <= _end do
-- local _mid = math.floor( (_start + _end) / 2)
-- if _CureDateNum > TB_WEATHER_CONFIG[_mid].Date then
-- _start = _mid + 1
-- elseif _CureDateNum < TB_WEATHER_CONFIG[_mid].Date then
-- _end = _mid - 1
-- else
-- return TB_WEATHER_CONFIG[_mid]
-- end
-- end
-- return nil
-- end
-- return nil
-- end
通过前辈的思路解决了问题.具体记录如下.
function UI_WeatherMain:BinarySearch(_CurDateNum, _Start, _End)
local _Mid = math.floor( (_Start + _End) / 2)
if _CurDateNum > TB_WEATHER_FORECAST[_Mid].Date then
self:BinarySearch(_CurDateNum, _Mid, _End)
elseif _CurDateNum < TB_WEATHER_FORECAST[_Mid].Date then
self:BinarySearch(_CurDateNum, _Start, _Mid)
else
if _CurDateNum == TB_WEATHER_FORECAST[_Start].Date then
self.Start = _Start
else
_Start = _Start + 1
end
if _CurDateNum == TB_WEATHER_FORECAST[_End].Date then
self.End = _End
else
_End = _End - 1
end
if self.Start ~= _Start or self.End ~= _End then
self:BinarySearch(_CurDateNum, _Start, _End)
end
end
end
这样可以找到数据的开始点和结束点.中间的数据就是我需要的.