有关如何构建此数据的建议?

时间:2012-11-09 07:53:01

标签: java oop

我收到这些数据,它是通过网络进行的,所以需要在本地缓存它。

数据格式为:

Action (String)
    Direction (String)
        Frame (int)
            X,Y (Point or int,int)

用法基本上是:

Point myPoint = data.get(action).get(direction).get(frame);
myPoint.x; // do something with x and y

我尝试了这种巨大的hashmap类型的结构:

HashMaP<String, HashMap<String, HashMap<int, Point>>> 

它有效,但很丑陋且容易出错。

我也尝试将它分成Classes,它有效;但需要很多家务代码。

任何人都知道这个数据结构叫什么,也许我可以google它。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

隐含在“巨大的hashmap结构类型”中是实体之间的关系:

  • action是一个索引'many'方向的字符串
  • direction是一个索引'many'frame
  • 的String
  • frame是一个索引“多个”点的数字
  • Point是一个结构

一种简单的方法可能是定义一个包含'action''direction'和'frame'的'key'对象,并在Map结构中使用它。例如

class PointKey {
    String action, direction;
    int frame;
    PointKey(String action, String direction, int frame { .. init etc etc }

...

取决于使用特性,您需要覆盖hashCode以根据三部分密钥提供一些“合理的”唯一值,或者如果您希望有一个Comparable则实现Map大量的这些值,你希望阅读它们比阅读它们更多。

然后你定义你的Map<PointKey,Point> data = new HashMap<PointKey,Point>();

Map<PointKey,Point> data = new TreeMap<PointKey,Point>();

...
// PointKey instance that is retained and used again and again, purely for 'access' purposes
dataKey.setIdentifiers(myAction, myDirection, myFrame);
Point myPoint = data.get(dataKey)

取决于您选择的方法。

另一个问题是,如果你要创建大量的这些密钥是创建新密钥以随机访问它们的开销,在这种情况下你可能喜欢使用flyweight,例如。

{{1}}