一尘不染

如何用两个键(键对,值)创建HashMap?

java

我有一个2D整数数组。我希望将它们放入HashMap中。但是我想从基于数组索引的HashMap访问元素。就像是:

对于A [2]
[5],map.get(2,5)它返回与该键关联的值。但是,如何使用一对密钥创建一个hashMap?或者通常是多个键:Map<((key1, key2,..,keyN), Value)以一种我可以使用get(key1,key2,… keyN)来访问元素的方式。

编辑:发布问题3年后,我想再添加一点

我遇到了另一种方法NxN matrix

数组索引,ij可被表示为一个单一的key方式如下:

int key = i * N + j;
//map.put(key, a[i][j]); // queue.add(key);

索引可以通过key以下方式撤消:

int i = key / N;
int j = key % N;

阅读 203

收藏
2020-09-08

共1个答案

一尘不染

有几种选择:

2维

地图地图

Map<Integer, Map<Integer, V>> map = //...
//...

map.get(2).get(5);

包装器关键对象

public class Key {

    private final int x;
    private final int y;

    public Key(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Key)) return false;
        Key key = (Key) o;
        return x == key.x && y == key.y;
    }

    @Override
    public int hashCode() {
        int result = x;
        result = 31 * result + y;
        return result;
    }

}

在这里实施equals()hashCode()至关重要。然后,您只需使用:

Map<Key, V> map = //...

和:

map.get(new Key(2, 5));

Table
从番石榴

Table<Integer, Integer, V> table = HashBasedTable.create();
//...

table.get(2, 5);

Table使用下方 的地图

N尺寸

请注意,特殊Key类是缩放到n维的唯一方法。您可能还会考虑:

Map<List<Integer>, V> map = //...

但这从性能角度以及可读性和正确性(强制列表大小的简便方法)方面都是可怕的。

也许看看在Scala上有元组和case类的地方(用单线替换整个Key类)。

2020-09-08