Java 我可以用“创建哈希映射”吗;相对的;变量?

Java 我可以用“创建哈希映射”吗;相对的;变量?,java,data-structures,hashmap,Java,Data Structures,Hashmap,假设我有一个代表棋盘游戏的2D数组。我有一个“值”(键)(1、2、3…12)列表,表示数组中相对于当前位置的位置 例如,在数组[1][1]中,键1表示数组[1][0]左侧的位置,而键2可能表示数组[0][0]左侧和上方的位置 有没有办法在HashMap中存储这两个数据(我希望每次使用这些值时避免使用一堆if语句)?或者,在任何数据结构中?现在是创建枚举的正确时间吗? 我试过这个,显然不起作用 int row = 3; int col = 5; HashMap<Integer,String&

假设我有一个代表棋盘游戏的2D数组。我有一个“值”(键)(1、2、3…12)列表,表示数组中相对于当前位置的位置

例如,在
数组[1][1]
中,键1表示数组[1][0]左侧的位置,而键2可能表示数组
[0][0]
左侧和上方的位置

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

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

int row = 3;
int col = 5;
HashMap<Integer,String> markMap = new HashMap<>();
markMap.put(1,"col-1");
String location = markMap.get(1);
grid[row][(int)location] = 500;
int行=3;
int col=5;
HashMap markMap=新的HashMap();
markMap.put(1,“col-1”);
字符串位置=markMap.get(1);
网格[行][(内部)位置]=500;

利用OOP,创建一个对象!存储一个“delta”位置对象数组,它是一对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中,也可以实现DeltalLocation对象来保存值。由你决定

利用OOP,创建一个对象!存储一个“delta”位置对象数组,它是一对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中,也可以实现DeltalLocation对象来保存值。由你决定

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

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
int行=3
整数列=5
HashMap rowOffset=新HashMap();
HashMap colOffset=新HashMap();
rowOffset.put(1,0)
colOffset.put(1,-1)
网格[行+行偏移量.get(1)][列+列偏移量.get(1)]=500

创建一个同时存储行和列偏移的对象可能会更简洁,但这应该会让您产生想法。

有很多解决方案可以使用。想到的一个方法是将行偏移和列偏移存储在两个不同的映射中。比如说

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
int行=3
整数列=5
HashMap rowOffset=新HashMap();
HashMap colOffset=新HashMap();
rowOffset.put(1,0)
colOffset.put(1,-1)
网格[行+行偏移量.get(1)][列+列偏移量.get(1)]=500

制作一个同时存储行和列偏移量的对象可能会更简洁,但这应该会给你一个想法。

到目前为止,这是一个很好的建议。在其他所有人的基础上,还可以创建偏移枚举

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.setRelativeItem(grid, 1, 1, LEFT, myValue)
尽管这是一个笨拙的、公认的糟糕抽象。或者,您可以为偏移量定义getter(添加只返回私有变量值的实例方法
xoffset
yoffset
)。然后你会有静态对象,左上角,左下角,就像cricket_007的解决方案一样。在这种情况下,如果你想得到一个值,你可以调用

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

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

根据定义,您不能自己实例化一个枚举,而且只有固定数量的枚举(在本例中为左、左上、左下…。

到目前为止,这是一个很好的建议。在其他所有枚举的基础上,您还可以创建一个偏移枚举

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.setRelativeItem(grid, 1, 1, LEFT, myValue)
尽管这是一个笨拙的、公认的糟糕抽象。或者,您可以为偏移量定义getter(添加只返回私有变量值的实例方法
xoffset
yoffset
)。然后你会有静态对象,左上角,左下角,就像cricket_007的解决方案一样。在这种情况下,如果你想得到一个值,你可以调用

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

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

根据定义,您不能自己实例化枚举,并且只有固定数量的枚举(在本例中为左、左上、左下…).

此解决方案实际上类似于使用枚举。此解决方案的优点是,如果需要,您可以在运行时动态创建更多的delta-x和delta-y。如果您可以静态修复delta,则枚举也很好。@mkzh,但不必有N^2个枚举。如果我们在任何方向上查找多个位置,该怎么办n?如果增量位置超出数组怎么办?枚举是实际对象^对象具有枚举的任何方法也可以具有。java中的枚举基本上是多个实例的静态单例模式的泛化。此解决方案实际上类似于使用枚举。此解决方案的优点是可以动态创建更多数据如有必要,在运行时使用elta-x和delta-y。如果您可以静态修复增量,则枚举也可以。@mkzh,但不需要有N^2个枚举。如果我们在任何方向上查看多个位置,该怎么办?如果增量位置超出数组,该怎么办?枚举是实际对象^对象具有枚举的任何方法都可以作为wjava中的ell.enum基本上是多个实例的静态单例模式的泛化。我想我理解enum。你能简单介绍一下我将如何在我的主类中构造/引用/使用enum吗?例如,如果我想更改某个特定位置的值。我更新了我的答案,提供了更多的细节。我我个人会添加getter(看起来好一点,但仍然不是很好)。请注意,您可以在数组访问器操作符中执行操作,但强制转换不会计算表达式。我在您自己的回答中注意到您有
grid[row][(int)location]=500
。这无法工作的原因是,在运行时,Java将尝试转换字符串“col-1”