2015-06-25 88 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