2015-06-25 61 views
1

我有一个要求,即多个枚举需要在Map<Key,Value>(枚举的组合将返回唯一值)中找到值。 我认为有很多选择,比如有一个包装对象说Key,它将作为一个Key。此外,如果按键限制为两个(不确定),我们可以使用番石榴表。从多个枚举类型创建映射的唯一键

要检查下面的方法,其中两个枚举将映射到一个独特的计算值,需要理解的建议 -
我)如果这种做法是罚款?
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 

谢谢!

+0

是否希望您的密钥由(来自)多个枚举类型*或多个枚举*值*(相同类型)组成? – Buurman

回答

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; 
} 

应该对冲突相当强劲,由于质数,它是扩展到支持无枚举。

0

如果你愿意,你可以引入一个array包装这样一个通用的解决方案:

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" 

注意,它可以结合不枚举,但任何类型都有正确定义的hashCodeequals。但是,您应该在MultiKey构造函数中保持相同的参数顺序。

+0

感谢您的答案 - 它是一个方便的多键实施。 – prash