9

2 つのキーを持つマップを作成したい:

map.put (key1,key2,value1);// Insert into map
map.get(key1,key2); // return value1

multikeyMapを調べましたが、どうすればよいかわかりません

4

7 に答える 7

10

2 つの値から作成されたキーが必要なようです。いずれにせよ、これら 2 つの値は別の型に自然にカプセル化する必要があることに気付くかもしれません。または、型を作成することもできKey2<K1, K2>ます。(ここでの命名はKey3Key4などを許可します。ただし、行き過ぎはお勧めしません。)

中間の何かについては、これが本当に必要なクラス内にプライベート静的クラスを作成できます(内部実装の詳細のみの場合)。それが自然なカプセル化ではない場合 (たとえば、この特定のシナリオ以外では意味をなさない「名前と人口」のようなもの)、意味のあるプロパティ名を保持するという点では良いでしょうが、それを公に公開することはありません。

これらのシナリオのいずれにおいても、コンストラクターで初期化され、 と の両方に寄与する 2 つの最終変数を持つ新しい型にequalsなりhashCodeます。例えば:

public final class Key2<K1, K2> {
    private final K1 part1;
    private final K2 part2;

    public Key2(K1 part1, K2 part2) {
        this.part1 = part1;
        this.part2 = part2;
    }

    @Override public boolean equals(Object other) {
        if (!(other instanceof Key2)) {
            return false;
        }
        // Can't find out the type arguments, unfortunately
        Key2 rawOther = (Key2) other;
        // TODO: Handle nullity
        return part1.equals(rawOther.part1) &&
            part2.equals(rawOther.part2);
    }

    @Override public int hashCode() {
        // TODO: Handle nullity
        int hash = 23;
        hash = hash * 31 + part1.hashCode();
        hash = hash * 31 + part2.hashCode();
        return hash;
    }

    // TODO: Consider overriding toString and providing accessors.
}

より状況固有の型は、ジェネリックではないため、わずかに単純になります。特に、これは、型引数について心配する必要がなく、変数に適切な名前を付けることができることを意味します。

于 2012-05-28T16:38:20.337 に答える
10

どうですか

class Key{
 private final String key1;
 private final String key2;
//accessors + hashcode + equals()
}

Map<Key, Value> map
于 2012-05-28T16:39:14.673 に答える
2

Guava のTable実装の 1 つを使用することを検討してください。ドキュメントから:

行キーと列キーと呼ばれるキーの順序付けられたペアを単一の値に関連付けるコレクション。テーブルはまばらで、行キーと列キーのペアのごく一部のみが対応する値を保持している場合があります。

于 2012-05-28T16:50:08.693 に答える
2

外部ライブラリを使用できる場合、Guavaはこれを正確に として提供Table<R, C, V>し、2 つのキーをそれぞれ「行」と「列」と呼んでいます。(開示:私はGuavaに貢献しています。)

于 2012-05-28T16:50:15.017 に答える
1

Java が言語レベルでタプルをサポートしていないのは残念です。そのため、こちらのいくつかの回答で示されているようなアドホック構造を使用する必要があります。これにより、大量の定型文とコードの重複が発生します。

Functional Javaには、タプルのライブラリー・サポートがあります。ここでの法案に適合するクラスはP2. 名前は「2つの要素を持つ製品」を意味します。(積は、複合型の代数用語です。) ライブラリは、最大 8 つの要素のタプルをサポートします。クラスは必要なすべてのP{n}メソッドをオーバーライドします

タプルを構築するためPの静的ファクトリ メソッドを提供するという名前のクラスがあります。p

使用法:

import fj.P2;
import fj.Ord;
import fj.data.TreeMap;

import static fj.Ord.*;
import static fj.P.*;

TreeMap<P2<Integer, String>, String> m = 
  TreeMap.<P2<Integer, String>, String>empty(p2Ord(intOrd, stringOrd)).
  set(p(1, "2"), "onetwo").
  set(p(5, "3"), "fivethree");
于 2012-06-03T17:54:03.720 に答える
1

キーを文字列にマップして、キー 1 + キー 2 を連結しない理由

于 2012-05-28T16:39:14.360 に答える
1

key1 と key2 を介して常に一緒にアクセスしたい場合は、それらをキーとしてセパレーターで連結し、法線マップを使用することができます。

于 2012-05-28T16:39:20.040 に答える