記一次問題解決思路
需求是根據時間范圍查一些數據然后計算,假設有180個設備,理想狀態下應該查回來180條數據,
數據格式是<Map<String,Object>>List 里面每個map就是一條數據,理想狀態下它們是連續的,也就是
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=1}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=2}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=3}
....
這樣的
那么問題就來了,假設庫里這個時間段有一個設備或多個設備沒有上傳數據,那么就會出現斷裂
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=1}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=2}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=3}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=4}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=6}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=7}
....
可以看到,sid為5的數據沒有查到.為了保證數據連續
所以要為沒有數據的設備添加一條各項value為null的記錄
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=1}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=2}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=3}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=4}
{valMin=null, valAvg=null, valMax=null, sid=5}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=6}
{valMin=5.0, valAvg=27.933, valMax=37.9, sid=7}
....
就像這樣
看起來是不是很容易,其實確實容易,但是在這里走了彎路,所以要記錄下來
最開始我是想着這還不簡單,我把最大的設備數量拿到,然后循環設備從1到180,然后看哪個map的sid和我的記錄不一樣
比方說循環到5,結果因為缺失了sid為5的數據,所以這個記錄的sid和我循環到的index一定不一樣
我就可以在這里添加一條數據那就完事
但是不是那么容易
因為我循環是這樣對比的
if((i + 1) != Integer.valueOf(Val.get(i).get("sid").toString())) //注:i從0起 sid從1到180
假設少了一條記錄,那么總記錄就是179條,而不是180條,這樣的話到了第180次循環的時候,就會報空指針異常
因為訪問了不存在的角標 180
那么用可以用Map的containsValue(Object value)方法來判斷是否有當前這個sid嗎?其實也是不行的,
這個方法只能判斷map里是否有這個值,而不能判斷指定key下是否有這個值,比方說我們現在有
valMin, valAvg, valMax, sid 這四個key,只要其中有一個包含指定的value就算包含,那么結果也是不准確的,我不能確定它包含的這個值是不是我想要的sid的值
一時間工作似乎陷入了停滯....
還好我旁邊有大佬
大佬說:你為什么不跳出來呢
我說:啥跳出來???
大佬說:你這樣,你把sid作為key,把每個map作為value塞到一個map里然后放入一個List再去遍歷哪里缺少了相應的sid就是哪里缺少了數據
像這樣
Map<Integer, Map<String, Object>> listmap = new HashMap();
for (Map<String, Object> map : Val) {
listmap.put(Integer.valueOf(map.get("sid").toString()), map);
}
塞進去
然后這樣
for (int i = 0; i < sid; i++) { if (!listmap.containsKey(i + 1)) { HashMap<String, Object> hashMap = new HashMap<>(); hashMap.put("sid", i + 1); hashMap.put("ValMax", null); hashMap.put("ValMin", null); hashMap.put("ValAvg", null); Val.add(i, hashMap); continue; } }
注:add里要加i,否則會添加到list末尾位置
我突然對大佬產生了仰慕之情,大佬就是大佬,看問題的角度都不一樣(還是自己太菜了)
這件事說明解決問題的時候不要鑽牛角尖,要嘗試從更高的角度去解決問題,可能沒有那么復雜呢
