我是这个领域的新手所以请原谅我的愚蠢错误:)所以我面临的问题是: 在我的网页上,我正在显示一个表格。目前我的问题涉及该表的三列。
First is : Area Code
Second is : Zone Code
Third is: Value
这三者之间的关系是:
1区号有6个不同的区号,所有6个区号都有相应的“值” 我需要一个数据结构,它可以让我灵活地获得区域代码的“价值”,该代码属于特定的区号。
我对所有区号都有相同的区号:
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>>
不适用于参数(Integer,Double)
在线:
while(oResult.next())
retailPrices.put((new Integer(oResult.getString("AREA"))), (codes.put(new Integer(oResult.getString("ZONE_CODE")), new Double(oResult.getString("VALUE")))));
}
请帮我弄清楚这个问题。我是否遵循正确的方法?
答案 0 :(得分: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
}
这样你就可以使用List&lt; Area&gt;在你的代码中。您还可以封装任何与您希望相关的规则。
Java是一种面向对象的语言。不要在原语方面思考,而是从对象和封装方面开始思考。
答案 1 :(得分:1)
嗯,你看到的问题
在Map类型中放置(Integer,Map)的方法不适用于参数(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));
那应该为你解决
我认为你所选择的结构并不适合这个。如果您的每个区域代码都具有不与其分离的固有和本机值,那么您可能希望将区域代码设置为类或枚举,并将值作为私有成员。然后你可以摆脱1级Map
s。
编辑为区域值添加枚举骨架
如果你想看看区域值的Enum是什么,这里有一个示例:
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;
}
}
答案 2 :(得分:1)
正如你所说,你是新手,我也建议抽象。即使你不使用它,它也会向你展示一些OO的想法:)
areaCode和zoneCode一起向我建议一个位置:
public class Location {
private Integer zoneCode;
private Integer areaCode;
// getters and setters here
// With an equals and hashCode (always implement BOTH or NONE)
// they behave well in a Map, otherwise you can have the same location
// twice if the same (zone, area) are in more than 1 object
// NB these implementations don't like NULL areaCodes or zoneCodes
public boolean equals(Object other) {
if (other == null) return false;
if (other == this) return true;
if (other instanceof Location) {
Location otherLocation = (Location)other;
return (zoneCode == otherLocation.zoneCode) && (areaCode == otherLocation.areaCode);
}
return false;
}
public int hashCode() {
return zoneCode.hashCode() + areaCode.hashCode();
}
}
然后你可以有一个
Map<Location, Double> localizedPrices = new HashMap<Location,Double>();
如上所述,看看并忽略:))