1. ホーム
  2. java

[解決済み] 2つのキー(キーペア、値)を持つHashMapを作成する方法とは?

2022-06-29 14:47:19

質問

整数の2次元配列を持っています。私はそれらをHashMapに入れたいと思います。しかし、私はArray Indexに基づいてHashMapから要素にアクセスしたい。みたいな感じ。

A[2][5]について。 map.get(2,5) となり、そのキーに関連する値が返されます。しかし、キーのペアを持つhashMapを作成するにはどうしたらよいでしょうか。あるいは一般に、複数のキーを持つ Map<((key1, key2,..,keyN), Value) というように、get(key1,key2,...keyN)を使って要素にアクセスすることができます。

EDIT : 質問を投稿してから3年、もう少し追加したいと思います。

の別の方法に出会いました。 NxN matrix .

配列のインデックスです。 ij は、1つの key として表現することができます.

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

また、インデックスは key をこのように表現します。

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

どのように解決するのですか?

いくつかの方法があります。

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 クラスをワンライナーで置き換えます)。