我可以使用" relative"创建一个HashMap。变量?

时间:2016-07-18 00:00:43

标签: java data-structures hashmap

让我们说我有一个代表棋盘游戏的2D阵列。我有一个"值列表" (键)(1,2,3 ... 12)表示阵列中相对于当前位置的位置。

例如,在1中,键1代表左侧boost::lockfree::spsc_queue<T, boost::lockfree::capacity<1>> 的位置,而键2可能代表阵列std::optional<T>左侧和上方的位置。

在HashMap中有没有办法存储这两个数据(我想在每次使用值时避免一堆if语句)?或者,在任何数据结构中?这是创建枚举的正确时间吗?

我试过这个,显然不起作用。

array[1][1]

3 个答案:

答案 0 :(得分:2)

利用OOP并制作一个对象!存储一组&#34; delta&#34;位置对象,它是一对delta-x,delta-y,用于存储当前索引的相对位置。

在您的示例中,

int row = 1;
int col = 1;
// one left
array[row][col] = new DeltaLocation(-1,0); // (col, row) or (x, y) 

int relativeCol = col + array[row][col].getDeltaX();

您可以将这些放入Hashmap中,也可以实现DeltaLocation对象来保存值。由你决定。

答案 1 :(得分:1)

有许多解决方案可行。想到的是将行偏移和列偏移存储在两个不同的映射中。例如

int row = 3
int col = 5
HashMap<Integer, Integer> rowOffset = new HashMap<>();
HashMap<Integer, Integer> colOffset = new HashMap<>();
rowOffset.put(1, 0)
colOffset.put(1, -1)
grid[row + rowOffset.get(1)][col + colOffset.get(1)] = 500

创建一个存储行和列偏移的对象可能会更清晰,但这应该会给你一个想法。

答案 2 :(得分:1)

到目前为止的好建议。建立其他人的基础,你也可以创建一个补偿枚举

enum Direction {
    LEFT(-1, 0),
    UPPERLEFT(-1, -1),
    DOWN(0, - 1),
    ...;

    public final int xoffset;
    pubiic final int yoffset;

    Direction(int xoffset, int yoffset) {
        this.xoffset = xoffset;
        this.yoffset = yoffset;
    }

    public static GridObject getRelativeItem(GridObject[][] grid, int x, int y, Direction dir) {
        return grid[x + dir.xoffset][y + dir.yoffset];
    }

    public static void setRelativeItem(GridObject[][] grid, int x, int y, Direction dir, GridObject newValue) {
        grid[x + dir.xoffset][y + dir.yoffset] = newValue;
    } 
}

如果您坚持使用此设计,则可以通过调用访问网格项(如果您想访问(1,1)的左侧

Direction.getRelativeItem(grid, 1, 1, LEFT)

要设置,您也可以调用它来设置值:

Direction.setRelativeItem(grid, 1, 1, LEFT, myValue)

虽然这很尴尬,但不可否认的是糟糕的抽象。或者,您可以为偏移量定义getter(添加仅返回私有变量值的实例方法xoffsetyoffset)。然后你会有静态对象LEFT,UPPERLEFT,DOWN,就像cricket_007的解决方案一样。在这种情况下,如果您想获得一个值,可以调用

grid[x + LEFT.xoffset()][y + LEFT.yoffset()]

设置

grid[x + LEFT.xoffset()][y + LEFT.yoffset()] = myValue;

根据定义,您无法自己实例化枚举。 Enums are initialized by the JVM,并且只有固定数量(在这种情况下为LEFT,UPPERLEFT,DOWN ......)。