2010-03-15 91 views
3

我是這個領域的新手,所以請原諒我愚蠢的錯誤:)所以我面臨的問題是: 在我的網頁上,我正在顯示一個表。現在我的問題涉及表格的三列。Java數據結構暗示

First is : Area Code 
    Second is : Zone Code 
    Third is: Value 

這三者之間的關係是:

1區號有6個不同區碼的和所有6個區碼都有相應的「價值」 我需要一個數據structer這會給我的靈活性,獲得區域代碼的「價值」,該代碼屬於特定的區域代碼。

我對所有的區號相同的區域代碼:

Zone codes are: 111, 222, 333, 444, 555, 666 

衝浪您的計算器後,我想我可以用這個結構去:

Map<Integer, Map<Integer, Double>> retailPrices = new HashMap<Integer, Map<Integer, Double>>(); 
    Map<Integer, Double> codes = new HashMap<Integer, Double>(); 

其中reatailPrices將舉行一個區域代碼和地圖代碼作爲關鍵字,「價值」作爲值。

,但是當我試圖通過SQL結果集來填充這個,我收到以下錯誤:

的方法put(Integer, Map<Integer,Double>)在類型 Map<Integer,Map<Integer,Double>>是不適用的參數(整型,雙精度)

on line:

while(oResult.next()) 

     retailPrices.put((new Integer(oResult.getString("AREA"))), (codes.put(new Integer(oResult.getString("ZONE_CODE")), new Double(oResult.getString("VALUE"))))); 


     } 

請幫我弄清楚這個問題。我遵循正確的方法嗎?

回答

4

如果這三個項目是相關的,我建議你創建一個對象,它是有意義的問題所在,並一起封裝它們:

public class Area 
{ 
    private int areaId; 
    private List<Zone> zones; 

    // other code here 
} 

public class Zone 
{ 
    private int zoneId; 
    private double value; 

    // other code here 
} 

這樣,你可以使用列表<區>在碼。你也可以封裝任何你想要的規則。

Java的一種面向對象的語言。根據基元停止思考,並從對象和封裝開始思考。

+0

這是關閉 - 記得他說,1區有6個不同的區域代碼。所以你可能想要上面的「區域」是一個List或數組類型。 – Phil 2010-03-16 00:02:06

+0

嗨duffymo, 感謝您的答覆。唯一的關係是我上面描述的那個。我很新,所以將它封裝在一個類中是一個很大的挑戰:( 關係是: 1 Area = {6 Zones = 6 values} 所以每個區域代碼都有6個區域,而這些區域有6個值 我在爲內部hashmap添加值時做了什麼錯誤?爲什麼會出現這種錯誤? – techoverflow 2010-03-16 00:02:17

+0

+1:自定義類/值對象/ Javabean/DTO/POJO /無論你喜歡什麼樣的調用方式, – BalusC 2010-03-16 00:05:52

1

好了,你看到

The method put(Integer, Map) in the type Map is not applicable for the arguments (Integer, Double)

問題是因爲你的線插入retailPrices

(new Integer(oResult.getString("AREA"))) 

爲重點(一Integer),但

pegPlPrices.put(new Integer(...), new Double(...)) 

爲值。

方法put的在Map類型的簽名是

V put(K key, V value) 

你認爲它返回地圖本身,但它實際上返回要放置進去。所以pegPlPrices.put(Integer, Double)的類型是Double

把它放在一起,這意味着你正在試圖做到這一點:

retailPrices.put(Integer, Double) 

您需要打破你的行分爲兩個:

// do the put on pegPlPrices 
pegPlPrices.put(new Integer(oResult.getString("ZONE_CODE")), new Double(oResult.getString("VALUE")) 
// now add pegPlPrices into your map 
retailPrices.put((new Integer(oResult.getString("AREA"))), pegPlPrices)); 

而且應該修復它爲你

但是,我認爲你選擇的結構不適合這個。如果您的每個區域代碼都具有不與其分開的固有值和本地值,那麼您可能希望將區域代碼變爲類或Enum,並將該值作爲私人成員。然後你可以擺脫Map的1級別。

編輯補充枚舉骨架的區域,價值

如果你想看到一個枚舉的區域,價值是什麼,這裏是一個示例:

public enum Zone 
{ 
    private Integer zoneCode; 
    private Double value; 

    ZONE1(/* Integer, Double */), 
    ZONE2(/* Integer, Double */); 

    public Integer getZone() 
    { 
     return zoneCode; 
    } 
    public Double getValue() 
    { 
     return value; 
    } 

    private Zone(Integer z, Double v) 
    { 
     zoneCode = z; 
     value = v; 
    } 
} 
+0

嗨菲爾, 感謝您的回覆,請您解釋一下吧e與您的Enum解決方案? 我沒有得到你提到的內在和本地價值部分? – techoverflow 2010-03-16 00:05:26

+0

由此我的意思是,如果價值只是提及您的區域的另一種方式(因爲它似乎來自於描述),那麼您不應該將其視爲與區域分開,而應視爲它的一個屬性。Enum解決方案適用於此,PDO(由duffymo提供)也是如此。 – Phil 2010-03-16 00:18:17

+0

對不起,我忘了價值是雙倍的。在這種情況下,它不是區域的別名,但我仍然認爲,根據設計限制,您可能想要考慮將它們捆綁在一起。 – Phil 2010-03-16 00:25:27

1

至於你說你是新手,我也建議抽象。即使你不會使用它,它會告訴你有些OO思想:)

的AREACODE和zoneCode一起提出一個位置對我說:

​​

然後,您可以有一個

Map<Location, Double> localizedPrices = new HashMap<Location,Double>(); 

如上所說,看看並忽略:)