2012-11-09 35 views
0

我收到这些数据,它通过网络,因此需要在本地缓存。关于如何构造这些数据的建议?

的数据格式:

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

它的工作原理,但丑陋,容易出错。

我也尝试将它分成类,它工作;但需要大量的内务代码。

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

有什么建议吗?

+4

类有什么问题?什么“管家”代码在那里? – Bohemian

+0

每课都没什么问题,我猜“养家”是错误的词。你将如何构建/组织它,Action包含一个方向和方向包含Hashmap ? – user1516346

+0

在我们建议一个类层次结构之前,您需要描述每个项目与其父项之间的关系。一个'Action'可以有很多'Direction's等吗? –

回答

4

在“庞大的散列映射类型的结构的”隐式是实体之间的关系:

  • 动作是一个字符串,它索引“多”方向
  • 方向是一个字符串,它索引“多”帧
  • 帧是一个数,其索引“多”点
  • 点是一个结构

一个简单approac h可能是定义一个包含'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 TreeMap<PointKey,Point>(); 

取决于哪种方法您选择。

另一个问题是,如果您要创建大量这些密钥,则需要创建新密钥来随机访问这些密钥,在这种情况下,您可能想要使用flyweight

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