解決 >List里缺失數據的問題:跳出來你會看得更全面


記一次問題解決思路

需求是根據時間范圍查一些數據然后計算,假設有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末尾位置

 

我突然對大佬產生了仰慕之情,大佬就是大佬,看問題的角度都不一樣(還是自己太菜了)

這件事說明解決問題的時候不要鑽牛角尖,要嘗試從更高的角度去解決問題,可能沒有那么復雜呢

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。