1

我有一个要求,多个枚举需要在 ie 中找到一个值Map<Key,Value>(枚举的组合将返回一个唯一值)。我认为有很多选择,比如有一个包装对象说 Key,它将充当一个 Key。此外,如果键限制为两个(不确定),我们可以使用 Guava Table。

想要检查以下方法,其中两个枚举将映射到唯一的计算值,需要理解建议 -
i)如果这种方法很好?
ii) 如果是,它是否可扩展?即是否可以很容易地使其通用以支持'n'枚举,如toKey(Enum ...enums)

下面是两个枚举的片段 -

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

您可以尝试使用此代码生成用作密钥的哈希码:

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 个枚举。

于 2015-06-25T10:19:52.337 回答
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的类型equals。但是,您应该在构造函数中保持相同的参数顺序MultiKey

于 2015-06-25T10:37:58.897 回答