我有一个嵌套地图:
Map<Integer, Map<Integer, Double>> areaPrices = new HashMap<Integer, Map<Integer, Double>>();
并使用以下代码填充此地图:
while(oResult.next())
{
Integer areaCode = new Integer(oResult.getString("AREA_CODE"));
Map<Integer, Double> zonePrices = areaPrices.get(areaCode);
if(zonePrices==null)
{
zonePrices = new HashMap<Integer, Double>();
areaPrices.put(areaCode, zonePrices);
}
Integer zoneCode = new Integer(oResult.getString("ZONE_CODE"));
Double value = new Double(oResult.getString("ZONE_VALUE"));
zonePrices.put(zoneCode, value);
myBean.setZoneValues(areaPrices);
}
我想在同一个类的另一个方法中使用此Map的值。为此,我有一个豆。
如何在bean上填充它,以便我可以在其他方法中获取ZONE_VALUE
在我的bean中,我添加了一个新字段:
private Map<Integer, Map<Integer, Double>> zoneValues;
getter和setter为:
public Map<Integer, Map<Integer, Double>> getZoneValues() {
return zoneValues;
}
public void setZoneValues(Map<Integer, Map<Integer, Double>> areaPrices) {
this.zoneValues = areaPrices;
}
我在其他方法中要做的是这样的事情:
Double value = myBean.get(areaCode).get(zoneCode);
我该如何实现:(
答案 0 :(得分:2)
我想建议一个不同的,希望更具可读性的解决方案:
public class PriceMap {
private Map<Integer, Map<Integer, Double>> priceMap =
new HashMap<Integer, Map<Integer, Double>>();
// You'd use this method in your init
public Double setPrice(Integer areaCode, Integer zoneCode, Double price) {
if (!priceMap.containsKey(zoneCode)) {
priceMap.put(zoneCode, new HashMap<Integer, Double>());
}
Map<Integer, Double> areaMap = priceMap.get(zoneCode);
areaMap.put(areaCode, price);
}
public void getPrice(Integer areaCode, Integer zoneCode) {
if (!priceMap.containsKey(zoneCode)) {
// Eek! Exception or return null?
}
Map<Integer, Double> areaMap = priceMap.get(zoneCode);
return areaMap.get(areaCode);
}
}
我认为这是一个更好,更易读的抽象,非常重要的是,几个月后你或其他人更容易阅读。
编辑已添加get get
如果你坚持使用get(areaCode).get(zoneCode)(顺序颠倒),但myBean完全属于你,你可以这样做:
public class MyBean {
// I suppose you have this already
private final Map<Integer, Map<Integer, Double>> priceMap =
new HashMap<Integer, Map<Integer, Double>>();
private class LooksLikeAMap implements Map<Integer, Double> {
private Integer areaCode = areaCode;
public LooksLikeAMap(Integer areaCode) {
this.areaCode = areaCode;
}
public Double get(Object zoneCode) {
if (!priceMap.containsKey(zoneCode)) {
// Eek! Exception or return null?
}
Map<Integer, Double> areaMap = priceMap.get(zoneCode);
return areaMap.get(areaCode);
}
// Implement other methods similarly
}
public Map<Integer, Double> get(Integer areaCode) {
return new LooksLikeAMap(areaCode);
}
}
好吧,在HTML textarea中编程不是我的强项,但这个想法很清楚。 制作一些由完整数据集支持的Map结构,并初始化它 使用所需的AreaCode映射结构。
如果想法不明确,请快速发表评论,因为它已经很晚了:)
修改强>
我是个白痴。我认为数据首先是区域,然后是区域,而get应该是区域优先,然后是区域。在这种情况下,Map已经具有正确的结构,第一个区域然后是区域,因此这不是必需的。默认情况下,get-get是public MyBean {
public Map<Integer, Double> get(Integer areaCode) {
return data.get(areaCode);
}
}
答案 1 :(得分:1)
首先,您需要的只是
myBean.getZoneValues(areaCode).get(zoneCode);
while循环有烦恼,你需要拨打myBean.setZoneValues(areaPrices);
在while循环旁边
答案 2 :(得分:0)
您无法直接控制第二个get()调用,因为您有一个嵌套的Map,您需要返回相应的嵌套Map以便能够执行您想要的操作。像这样的吸气者应该这样做:
public Map<Integer, Double> get(Integer areaCode) {
return zoneValues.get(areaCode);
}
因此,当客户端代码调用get(areaCode)
时,将返回一个地图,然后他们可以调用get(zoneCode)
。
我建议您重构以消除嵌套的地图,因为您无法阻止客户端代码更改返回的地图,代码很难阅读,如果您想要添加更多内容,您将遇到问题功能 - 假设您希望将来提供区号的字符串描述。
类似于Map<Integer, AreaCode>
,其中AreaCode
是一个对象,其中包含您当前作为嵌套Map的内容,可能是一个很好的起点。