1

複数の列挙型が ie の値を見つける必要があるという要件がありますMap<Key,Value>(列挙型の組み合わせは一意の値を返します)。キーとして機能するラッパーオブジェクトにキーと言うような多くのオプションがあると思います。また、キーが 2 つに制限されている場合は、Guava Table を使用できます (不明)。

2 つの列挙型が一意の計算値にマップされる以下のアプローチを確認したいので、理解するための提案が必要です -
i) このアプローチが問題ない場合?
ii) はいの場合、スケーラブルですか? つまり、次のように「n」個の列挙型をサポートするように簡単に汎用にすることができますtoKey(Enum ...enums)

以下は、2 つの列挙型のスニペットです。

static Integer toKey(Status s, SubStatus ss) {
   return Integer.valueOf(s.ordinal() * SubStatus.values().length + ss.ordinal());
}

Status { NONE, PASS, WARN, REJECT }
SubStatus { NONE, SOFT_REJECT, HARD_REJECT }

Integer key1 = toKey(Status.REJECT, SubStatus.HARD_REJECT)
Integer key2 = toKey(Status.WARN, SubStatus.NONE)

then key1 != key2 

ありがとう!

4

2 に答える 2

0

一般的な解決策が必要な場合は、次のような配列ラッパーを導入できます。

import java.util.Arrays;
import java.util.Objects;

public final class MultiKey {
    private final Object[] elements;

    public MultiKey(Object... elements) {
        this.elements = Objects.requireNonNull(elements);
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(elements);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null || getClass() != obj.getClass())
            return false;
        return Arrays.equals(elements, ((MultiKey) obj).elements);
    }

    @Override
    public String toString() {
        return Arrays.toString(elements);
    }
}

キーとして使用できHashMapます:

Map<MultiKey, String> testMap = new HashMap<>();
testMap.put(new MultiKey(Status.NONE), "none");
testMap.put(new MultiKey(Status.REJECT, SubStatus.SOFT_REJECT), "soft-reject");
testMap.put(new MultiKey(Status.WARN, SubStatus.SOFT_REJECT), "warn");
System.out.println(
    testMap.get(new MultiKey(Status.REJECT, SubStatus.SOFT_REJECT))); // prints "soft-reject"

hashCode列挙型ではなく、適切に定義された任意の型を組み合わせることができることに注意してくださいequalsMultiKeyただし、コンストラクターでは同じ引数の順序を維持する必要があります。

于 2015-06-25T10:37:58.897 に答える
0

このコードを試して、キーとして機能するハッシュ コードを生成できます。

static int toKey(Status s, SubStatus ss) {
  final int prime = 31;
  int result = 1;
  result = prime * result + ((s == null) ? 0 : s.hashCode());
  result = prime * result + ((ss == null) ? 0 : ss.hashCode());
  return result;
}

素数による衝突に対してかなり堅牢である必要があり、n Enums をサポートするように拡張可能です。

于 2015-06-25T10:19:52.337 に答える