Нужна помощь с картой Java и Javabean - PullRequest
1 голос
/ 16 марта 2010

У меня есть вложенная карта:

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

   }

Я хочу использовать значение этой карты в другом методе того же класса. Для этого у меня есть боб.

Как мне заполнить его в бине, чтобы я мог получить ZONE_VALUE в этом другом методе

В своем бине я добавил одно новое поле как:

private Map<Integer, Map<Integer, Double>> zoneValues;

с геттером и сеттером как:

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 ]

2 голосов
/ 16 марта 2010

Я хотел бы предложить другое, надеюсь, более читаемое решение:

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 - не моя сильная сторона, но идея ясна. Создайте некоторую структуру, подобную Map, подкрепленную полным набором данных, и инициализируйте ее Структура карты с требуемым AreaCode.

Если идея не ясна, оставьте комментарий быстро, так как уже поздно здесь:)

EDIT

Я идиот. Я думал, что данные были сначала зоной, затем областью, в то время как get должен быть сначала областью, а затем зоной. В этом случае карта уже имеет правильную структуру, сначала область, а затем зону, поэтому в этом нет необходимости. Get-get по умолчанию, если вы сделаете

public MyBean {
  public Map<Integer, Double> get(Integer areaCode) {
    return data.get(areaCode);
  }
}
1 голос
/ 16 марта 2010

Для начала все, что вам нужно, это

myBean.getZoneValues(areaCode).get(zoneCode);

цикл while вызывает раздражение, вам нужно позвонить myBean.setZoneValues(areaPrices);
вне цикла пока

0 голосов
/ 16 марта 2010

Вы не можете напрямую управлять вторым вызовом get (), потому что у вас есть вложенная карта, вам нужно вернуть соответствующую вложенную карту, чтобы иметь возможность делать то, что вы хотите. Такой получатель должен сделать это:

public Map<Integer, Double> get(Integer areaCode) {
  return zoneValues.get(areaCode);
}

Поэтому, когда клиентский код вызывает get(areaCode), возвращается карта, которую они могут затем вызвать get(zoneCode) on.

Я бы посоветовал вам выполнить рефакторинг, чтобы исключить вложенные Карты, поскольку вы не можете помешать клиентскому коду изменить возвращенную Карту, код трудно читать, и у вас будут проблемы, если вы захотите добавить еще функциональность - представьте, что вы хотите предоставить строковое описание кода города в будущем.

Что-то вроде Map<Integer, AreaCode>, где AreaCode - это объект, содержащий то, что у вас есть в качестве вложенной Карты, может быть хорошим местом для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...