Предложение структуры данных Java - PullRequest
3 голосов
/ 16 марта 2010

Я новичок в этой области, поэтому, пожалуйста, извините за мои глупые ошибки :) Итак, проблема, с которой я сталкиваюсь: На моей веб-странице я показываю таблицу. На данный момент моя проблема связана с тремя столбцами таблицы.

    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>> не применимо для аргументов (целое, двойное)

на линии:

 while(oResult.next())

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


        }

пожалуйста, помогите мне разобраться с этой проблемой. Я придерживаюсь правильного подхода?

Ответы [ 3 ]

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

Если эти три элемента связаны, я бы порекомендовал создать значимый для вашей задачи объект и объединить их вместе:

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

в своем коде. Вы также можете инкапсулировать любые правила, касающиеся этих, которые вы хотите.

Java - объектно-ориентированный язык. Перестаньте думать с точки зрения примитивов и начните думать с точки зрения объектов и инкапсуляции.

1 голос
/ 17 марта 2010

Поскольку вы говорите, что вы новичок в этом, я также предлагаю абстракцию. Даже если вы не будете использовать его, это покажет вам немного ОО-мышления :)

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

Как сказано, взгляни и проигнорируй :) 1009 *

1 голос
/ 16 марта 2010

Ну, проблема, которую вы видите

Метод put (Integer, Map) в типе 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));

и это должно исправить это для вас

Я думаю, что выбранная вами структура, однако, не подходит для этого. Если каждый из ваших кодов зон имеет внутреннее и собственное значение, которое не отделено от него, вы можете захотеть превратить код зоны в класс или в Enum, в котором значение является частным членом. Тогда вы сможете избавиться от 1 уровня Map с.

Отредактировано для добавления скелета Enum для значения зоны

Если вы хотите посмотреть, каким будет Enum for Zone-Value, вот пример:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...