2010-03-15 2 views
3

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

First is : Area Code 
    Second is : Zone Code 
    Third is: Value 

Отношения между этими тремя является:

1 Код имеет 6 другой код зоны и все эти 6 кодов зон имеют соответствующие «Value» мне нужна structer данных, который дал бы мне гибкость получите «Значение» для кода зоны, который подпадает под конкретный код области.

У меня есть одни и те же коды зон для всех кодов Площади:

Zone codes are: 111, 222, 333, 444, 555, 666 

после серфинга вашего StackOverflow, я думал, что я могу пойти с этой структурой:

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


     } 

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

ответ

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 <Area> в вашем код. Вы также можете инкапсулировать любые правила, связанные с ними, которые вы хотите.

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

+0

Это близко - помните, что он сказал, что 1 Area имеет 6 разных кодов зон. Таким образом, вы, вероятно, хотите, чтобы «зона» выше была типом «Список» или «массив». – Phil

+0

Hi duffymo, Спасибо за ответ. Единственное отношение - это то, что я описал выше. Я очень новичок в этом, так что это будет большой проблемой, чтобы инкапсулировать его в один класс :( Отношения: 1 Area = {6 Zones = 6 values} поэтому каждый код зоны имеет 6 зон, и эти зоны имеют 6 значений. Что я делаю неправильно с добавлением значений к этому внутреннему хэшмапу? Почему эта ошибка? – techoverflow

+0

+1: пользовательский объект класса/значения/Javabean/DTO/POJO/any-you-like-to-call- это путь. – BalusC

1

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

The method put(Integer, Map) in the type Map is not applicable for the arguments (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 с.

Edited добавить скелет Enum для зоны-Value

Если вы хотите узнать, что было бы Enum для зоны-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; 
    } 
} 
+0

Привет, Phil, Спасибо за ответ. Не могли бы вы объяснить немного? e с вашим решением Enum? Я не получил внутреннюю и родную ценность, о которой вы говорили? – techoverflow

+0

Под этим я имел в виду, что Value - это еще один способ обратиться к вашей зоне (как это видно из описания), тогда вы не должны рассматривать ее как отдельную от Зоны, а скорее как ее свойство.Для этого работает решение Enum, равно как и PDO (предоставляется duffymo). – Phil

+0

Извините, я забыл, что значение - это двойное. В этом случае это не псевдоним для Зоны, но я все же думаю, что в зависимости от конструктивных ограничений вы можете подумать о том, чтобы связать их вместе. – Phil

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

Как сказано, посмотрите и проигнорируйте :)

Смежные вопросы