2012-02-04 118 views
-1

,我創建一個哈希表,其中每個條目對應於3個值 重點對象值(在數是兩個)的HashMap(JAVA)給出錯誤的結果

,我創建一個類,它的對象創建和將結果存儲在哈希映射中 這是我在下面的代碼,將我的傳入數據與哈希映射中的先前值進行比較。如果相同的數據出現,那麼我只是遞增該數據的計數器。我在for循環中使用了print語句。雖然兩個字符串匹配,但仍然我的代碼永遠不會在if循環中增加計數器。爲什麼?

for(i=1;i<=hMap.size();i++) 
{ 
     String skey = Integer.toString(i); 
     if(hMap.get(skey).olddata==comingdata) 
     { 
      hMap.get(skey).counter= hMap.get(skey).counter+1; 
     } 
} 
+1

您不會將對象與'=='進行比較。 – 2012-02-04 14:30:56

+1

換句話說,使用object.equals(otherObject) – 2012-02-04 14:32:27

+0

comingdata是一個字符串和hMap.get(skey).olddata也是一個字符串,但它是一個對象的字符串 – Natasha 2012-02-04 14:33:00

回答

1

你不,除非你想看看他們是否有相同參考值在Java中比較==對象。

if (hMap.get(skey).olddata.equals(comingdata)) { 
... 

你也不應該這樣暴露olddata;它應該可以通過獲取者獲得;例如getOldData()

1

目前尚不清楚的olddata的類型,但也許你應該使用equals()比較值:

if (hMap.get(skey).olddata.equals(comingdata)) 

在Java中,==用於要麼比較原始數據類型爲平等或比較對象類型爲身份。如果您需要比較等於的兩個對象類型,則必須使用equals()方法,該方法爲所有對象定義,因爲它繼承自Object類,因爲您知道您還必須在類中覆蓋equals()hashCode(),對該類有意義的實現。

2

你還沒有給出有關所涉及的類型幾乎足夠的信息,可是,可是我強烈懷疑,這就是問題所在:

if(hMap.get(skey).olddata==comingdata) 

,這將是比較引用,而不是平等的,如果olddatacomingdata是某種類型的參考文獻。 (編輯:通過它的聲音,他們是字符串的引用。)

我的猜測是,你想:

String skey = Integer.toString(i); 
if(hMap.get(skey).olddata.equals(comingdata)) 
{ 
    hMap.get(skey).counter= hMap.get(skey).counter+1; 
} 

或者說更有效,避免無意義的查找:

WhateverType value = hMap.get(Integer.toString(i)); 
if (value.olddata.equals(comingdata)) 
{ 
    value.counter++; 
} 

我還建議,如果你總是用一個整數查找,爲什麼不使用Integer鍵而不是總是把整數轉換成一個字符串?

此外,它值得遵循Java命名約定,並且如果它們還沒有,您應該使您的字段爲私有。

如果這一切都沒有幫助,請貼出更多代碼。問題發生在HashMap而不是在您的代碼中的可能性非常小。

0

應該

if(hMap.get(skey).olddata.equals(comingdata)) 
0

你實際上意味着comingdata.equals(hMap.get(skey).olddata)?此外請注意,equals(Object)hashCode()必須正確實施。

+0

Johannes - 鍵是'String'實例,我可以保證'String'正確地實現'equals(Object)'和'hashCode()'。 – 2012-02-04 14:47:50

+0

true ;-)對不起...... – Johannes 2012-02-04 15:34:05