Java数据结构建议

时间:2010-03-15 23:43:15

标签: java data-structures java-ee

我是这个领域的新手所以请原谅我的愚蠢错误:)所以我面临的问题是:  在我的网页上,我正在显示一个表格。目前我的问题涉及该表的三列。

    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>>不适用于参数(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 个答案:

答案 0 :(得分: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&lt; Area&gt;在你的代码中。您还可以封装任何与您希望相关的规则。

Java是一种面向对象的语言。不要在原语方面思考,而是从对象和封装方面开始思考。

答案 1 :(得分:1)

嗯,你看到的问题

  

在Map类型中放置(Integer,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));

那应该为你解决

我认为你所选择的结构并不适合这个。如果您的每个区域代码都具有不与其分离的固有和本机值,那么您可能希望将区域代码设置为类或枚举,并将值作为私有成员。然后你可以摆脱1级Map s。

编辑为区域值添加枚举骨架

如果你想看看区域值的Enum是什么,这里有一个示例:

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

答案 2 :(得分: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>();

如上所述,看看并忽略:))