用于多个值的Java查找表设计

时间:2014-10-14 11:43:26

标签: java design-patterns

我需要在Java中创建一个查找表,以便根据多个参数返回一个值。

例如:

['THE VALUE I NEED', 'PARAM A', 'PARAM B' ,'PARAM C']

所以基于3个参数PARAM A,B。C,我需要检索一个值。

我正在考虑使用Enum执行此操作,但可以复制相同的密钥,例如:

[RESULT 1, 'A' , 'B', 'C']
[RESULT 1, 'C' , 'B', 'C']
[RESULT 2, 'B' , 'C', 'A']

在Java中实现此查找表的最佳方法是什么,允许使用不同参数配置的重复键?

2 个答案:

答案 0 :(得分:1)

如果你的变量/参数是静态的,你可以坚持使用枚举:

public enum LookupElement{

    ELEM_1("A","B","C", 1),
    ELEM_2("C","B","C", 1),
    ELEM_3("B","C","A", 2);

    private final String a;
    private final String b;
    private final String c;
    private final int value;

    LookupElement(String a, String b, String c, int v){
        this.a = a;
        this.b = b;
        this.c = c;        
        this.value = v;
    }

    public static LookupElement getByValue(int v){
        for(LookupElement e : values()){
            if(e.value == v) return e;
        }
        return null;
    }

    public static LookupElement getByParams(String a, String b, String c){
        for(LookupElement e : values()){
            if(e.a.equals(a) && e.b.equals(b) && e.c.equals(c)) return e;
        }
        return null;
    }
}

答案 1 :(得分:1)

如果您需要一个比枚举更灵活的解决方案,您可以使用嵌套类和Map。

这里的关键是创建自己的轻量级数据类,在这种情况下Data将包围您要映射的值,ab和{{1 }} 这里。您需要覆盖cequals函数以合并所有字段。另外,我建议制作这些字段hashCode。对这些字段的更改不会自动更新final,并可能产生意外结果。如果您需要创建一次此查找表,您可能希望将结果映射包装在HashTable中,以阻止任何类意外修改基础集合。

Collections.unmodifiableMap

public static void main(String... args) { Map<Data, String> map = new HashMap<>(); map.put(new Data("1", "A", "B"), "Value A"); map.put(new Data("2", "F", "£"), "Value B"); map.put(new Data("D", "A", "B"), "Value C"); map.get(new Data("1", "A", "B")); // "Value A" } 上课:

Data