需要帮助java map和javabean

时间:2010-03-16 19:23:30

标签: java data-structures java-ee

我有一个嵌套地图:

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);

我该如何实现:(

3 个答案:

答案 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的内容,可能是一个很好的起点。