让我们说我有一个代表棋盘游戏的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]
答案 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(添加仅返回私有变量值的实例方法xoffset
和yoffset
)。然后你会有静态对象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 ......)。