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<String, HashMap<String, HashMap<int, Point>>> 

動作しますが、醜く、エラーが発生しやすくなります。

また、それをクラスに分割してみましたが、うまくいきました。しかし、多くのハウスキーピング コードが必要です。

このデータ構造が何と呼ばれているか知っている人は誰でも、Google で検索できるかもしれません。

助言がありますか?

4

1 に答える 1

4

「巨大なハッシュマップタイプの構造」には、エンティティ間の関係が暗黙的に含まれています。

  • アクションは、「多くの」方向にインデックスを付ける文字列です
  • 方向は、「多くの」フレームにインデックスを付ける文字列です
  • フレームは「多くの」ポイントにインデックスを付ける数です
  • ポイントは構造です

簡単なアプローチの1つは、「アクション」「方向」と「フレーム」を含む「キー」オブジェクトを定義し、これをマップ構造で使用することです。

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

...

使用特性に応じてhashCode、3つの部分からなるキーに基づいて「合理的に」一意の値を提供するためにオーバーライドするかComparable、これらの値が大量にあると予想され、それらをさらに読み取ることが予想される場合は実装する必要があります。それらを書くよりも。

次に、次のように定義しますMap

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

また

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

選択したアプローチによって異なります。

もう1つの懸念事項は、これらのキーを大量に作成する場合、それらにランダムにアクセスするための新しいキーを作成するオーバーヘッドです。そのような場合は、フライウェイトを使用することをお勧めします。

...
// PointKey instance that is retained and used again and again, purely for 'access' purposes
dataKey.setIdentifiers(myAction, myDirection, myFrame);
Point myPoint = data.get(dataKey)
于 2012-11-09T08:30:23.190 に答える