2015-06-20 80 views
1

我有一個座標系,如這樣的:如何結合並返回枚舉值

public enum Direction { 
    N (0, 1), 
    NE (1, 1), 
    E (1, 0), 
    SE (1, -1), 
    S (0, -1), 
    SW (-1, -1), 
    W (-1, 0), 
    NW (-1, 1); 

    private int x = 0, y = 0; 

    private Direction(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 

    public Direction combine(Direction direction) { 
     //unsure 
    } 
} 

我試圖用一種方法枚舉中組合的方向,如:

Direction.N.combine(Direction.E) -> should become Direction.NE 
Direction.N.combine(Direction.N) -> null or Direction.N again 

我想法是遍歷枚舉所有的值,並找到一個其x和y的組合匹配:

public Direction combine(Direction direction) { 
    Direction[] directions = Direction.values(); 

    for (int i = 0; i < directions.length; i++) 
     if (x + direction.x == directions[i].x && y + direction.y == directions[i].y) 
      return directions[i]; 

    return this; 
} 

但我覺得李這是解決這個問題的一種低效率的方式。有沒有另外一種方法來結合這些不涉及循環所有枚舉的方向?

我也想創建一個uncombine函數,它將反轉組合。

Direction.NE.uncombine() -> Direction[] {Direction.N, Direction.E} 

我也可以用同樣的循環技術,如:

public Direction[] uncombine() { 
    Direction[] directions = Direction.values(), 
       rtn = new Direction[2]; 

    for (int i = 0; i < directions.length; i++) 
     if (x == directions[i].x && directions[i].y == 0) 
      rtn[0] = directions[i]; 

    for (int i = 0; i < directions.length; i++) 
     if (y == directions[i].y && directions[i].x == 0) 
      rtn[1] = directions[i]; 

    return rtn; 
} 

所以是沒有辦法,我可以嘗試更有效的方法?

+1

你能告訴你會有什麼樣的結果像Direction.NE.combine(Direction.W)Direction.N.combine(Direction.S)嗎? – ppawel

+1

請注意,您的技術是不正確的:將N與SE組合使用E. –

+0

如果嘗試將N與S組合,您希望返回值爲多少? – bhspencer

回答

2

我認爲爲每個枚舉值創建一個Map<Direction, Direction>將使您在性能和代碼整齊性之間取得良好的平衡。

combine方法變爲:

public Direction combine(Direction other) { 
     return this.combinerMap.get(other); 
    } 

當然,你需要的枚舉類的初始化過程中建立的地圖。

從這種方法返回null是一個壞主意,因爲它將理智檢查的責任推回給調用者。所以,我會寫這樣的:

public Direction combine(Direction other) 
      throws InsaneDirectionsException{ 
     Direction res = this.combineMap.get(other); 
     if (res == null) { 
      throw new InsaneDirectionsException(
        "Can't combine directions " + this + 
        " and " + other); 
     } 
     return res; 
    } 
+0

我最終使用散列映射來正確映射所有座標之間的關係。 –

0

你可以保持Map<Byte, Map<Byte, Direction>>其中xy將指標。一旦計算新的xy,獲得Direction將如matrix.get(x).get(y)一樣簡單。

1

如果您的真實類與問題中的類一樣簡單,我認爲最有效的方法是手動「硬編碼」或預先計算(例如,在靜態init塊中)參數和結果之間的關係以及將其保存在地圖中,然後僅引用已有的結果。