2016-02-04 44 views
0

我會感激任何意見。我有這個代碼:投入TreeMap - 奇怪的行爲

TreeMap<Date, Double> predictPoints = new TreeMap<Date, Double>(); 
while(iterator_time.hasNext()) { 
      Date time = iterator_time.next(); 

      if (count < obs.toList().size()) { 
       count++;tmp1++; 
       continue; 
      } else {    
       for (int j = 0; j <= degreePolynom; j++) { 
        predictConsumption += coeff[j] * Math.pow(time.getTime(), j); 
       } 
       predictPoints.put(time, predictConsumption); 
       predictConsumption = 0.0; 
       count++;tmp2++; 
      } 

     } 

我遍歷Vector,在這個向量中是35036數字。 tmp1tmp2變量僅供檢查。 80%的數據被跳過(如果block,obs.toList()。size()是35036)和我使用的其餘數據(20%)。問題:我在else塊中迭代了7007次,但在predictPoints中只有7003個項目。如果我使用較少的數據,則不會發生此問題。如果我使用TreeMap而沒有Date,例如TreeMap<Integer, Double>那麼我在地圖上有7007項,它是正確的。每個數字都是獨一無二的 - 我測試過它。 4件丟失物品在哪裏? :-(

感謝您的任何意見。

+1

無關的,但爲什麼(哦,爲什麼)您使用'VECTOR'?它實際上已被棄用自從Java 1.2早在1998年。他們甚至建議在javadoc中使用'ArrayList'到['Vector'](https://docs.oracle.com/javase/7/docs/api/java/util/Vector.html)。 – Andreas

+0

@DmitryP。 'containsKey'只有一個參數,而且由於map的值('predictConsumption')永遠不爲null,所以簡單地檢查'put'的返回值比使用'containsKey'的額外調用要快。 – Andreas

回答

0

地圖不支持重複鍵,因此,如果您添加7007項目地圖,但只有7003項目,那麼項目的4有重複鍵結束和取代以前的值。

檢查的put()返回值來檢查它是否替換現有的值。

+0

我知道,但這很奇怪,因爲按鍵是日期而且是唯一的。沒有其他選擇?但是我會嘗試put()的價值。謝謝。 –

+0

@DanielHerbrych'Vector'(和它的'ArrayList'替換)允許重複的值,所以它可以有兩個具有相同時間戳的值。 – Andreas

+0

謝謝你,你是對的...有4個重複...!非常感謝 –