2016-09-11 1 views
0

私はチェスゲームを作っており、断片が "単位ベクトル"で動く方向を処理しています。Java:パースされたデカルトベクトル点のオブジェクトインスタンスを見つけるためのベクトルルックアップテーブルの作成方法

たとえば、ポーンは、一般に1つのスペースだけを前方に移動することができるので、(0,1)の単位ベクトルを有する。

このため、同じデータを保持するインスタンスが多数作成されています。これを避け、システムリソースの浪費を防ぐために、ボード上で使用できるすべての位置ベクトル(9x9)のリストを保持する中央ルックアップテーブルを保持することにしました。

これについては?私はこれらのベクトルのセットを持っていると私は

答えて

1

ファーストを避けたいのですが、反復なしで同じ構文解析されたデカルトの点を、持っているものを見つけることができないため、...

を覚えています「早期の最適化がすべての悪の根源である、時間の約97%という小規模な効率性を忘れるべきです。

したがって、この最適化を可能にすることで、このような方法であなたの運動Vectorクラスを設計するのが賢明だろうが、物事はかなり機能的になるまでそれを実装し、実際に遅らせます。

つまり、それは難しいことではありません(ユニットテストでは、最適化によってバグが導入されないことが保証されています)。最も簡単な方法は、Map<Integer, Map<Integer, A>>またはMap<String, A>のいずれかを使用することです。ここで、Aは移動ベクトルクラスです。あなたはそのように実現することができます。

public class MovementVector { 

    private static Map<String, MovementVector> cache = new HashMap<>(); 

    //Step 0 : all fields must be immutable, or instance sharing will backfire catastrophically 
    public final int r; 
    public final int c; 

    //Step 1 : make constructor(s) private so new instances can't be created without your knowledge 
    private MovementVector(int r, int c) { 
     this.r = r; 
     this.c = c; 
    } 

    public String toString() { 
     return makeString(r, c); 
    } 

    //Step 2 : single method that makes keys for a given r,c. 
    // Must be static so it can be used in get(..) below. 
    private static String makeString(int r, int c) { 
     return "(" + r + "," + c + ")"; 
    } 

    public boolean equals(Object o) { 
     if (! (o instanceof MovementVector)) return false; 
     MovementVector m = (MovementVector)o; 
     return r == m.r && c == m.c; 
    } 

    public int hashCode() { 
     return r * 10 + c; 
    } 

    //Step 3 : public static getter that functions as constructor/instance retriever 
    public static MovementVector get(int r, int c) { 
     String str = makeString(r,c); 
     MovementVector vectorFromCache = cache.get(str); 
     if (vectorFromCache != null) return vectorFromCache; 
     else { 
      MovementVector v = new MovementVector(r,c); 
      cache.put(str, v); 
      return v; 
     } 
    } 
} 

と使用方法:

MovementVector pawnMovement = MovementVector.get(0,1); 
MovementVector pawnMovement2 = MovementVector.get(0,1); 
//pawnMovement == pawnMovement2 
関連する問題