java - 从多个 Enum 类型为 Map 创建唯一键

标签 java dictionary enums multikey

我有一个要求,多个枚举需要在 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 

谢谢!

最佳答案

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

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

关于java - 从多个 Enum 类型为 Map 创建唯一键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31046989/

相关文章:

powershell - 如何为枚举创建转换器

java - Android Firebase Recyclerview - 如何取消选择先前选定的项目?

java - Recyclerview 未显示匹配父级

java - kyotocabinet java绑定(bind)安装错误

python - 参数在传递给函数时从字典中消失

python - Ansible 使用解析字符串和循环更新 Dict Var

iphone - 在 MKMapview 中拟合图像

java - Camel onException() 未触发

java - Java中枚举的反序列化

Swift:枚举大小写不是 'String' 类型的成员,强制使用原始值