Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多值Java查找表设计_Java_Design Patterns - Fatal编程技术网

多值Java查找表设计

多值Java查找表设计,java,design-patterns,Java,Design Patterns,我需要用Java创建一个查找表,以返回基于多个参数的值 例如: ['THE VALUE I NEED', 'PARAM A', 'PARAM B' ,'PARAM C'] [RESULT 1, 'A' , 'B', 'C'] [RESULT 1, 'C' , 'B', 'C'] [RESULT 2, 'B' , 'C', 'A'] 基于3个参数,我需要检索一个值 我正在考虑使用枚举执行此操作,但相同的键可以复制,例如: ['THE VALUE I NEED', 'PARAM A', 'PAR

我需要用Java创建一个查找表,以返回基于多个参数的值

例如:

['THE VALUE I NEED', 'PARAM A', 'PARAM B' ,'PARAM C']
[RESULT 1, 'A' , 'B', 'C']
[RESULT 1, 'C' , 'B', 'C']
[RESULT 2, 'B' , 'C', 'A']
基于3个参数,我需要检索一个值

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

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

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

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

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

如果需要比枚举更灵活的解决方案,您可以为此使用嵌套类和映射

这里的关键是创建您自己的轻量级数据类,在本例中,
data
将围绕您想要映射的值,
a
b
c
。您需要覆盖
equals
hashCode
函数以合并所有字段。此外,我建议将这些字段设置为最终的
。对这些字段的更改不会自动更新哈希表,并且可能会产生意外的结果。如果需要创建此查找表一次,则可能需要研究将生成的映射包装到
集合.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"

  }

您可以创建自己的类并将其用作键(当然它需要
hashCode
equals
实现),您可以增长自己的键,比如
Map。put(“A | B | C”,Result1)
应该在您的情况下起作用。当一个数字可以找到多个值时,您如何处理get(someNumber)?是否要返回集合?需要交换映射的键和值,以便OP可以使用此解决方案解决问题。例如:map.put(新数据(“A”、“B”、“C”)、“某些值”);此解决方案有两个缺点,其严重性取决于OP的用例。缺点1:查找通常需要创建一个数据对象并调用许多对instanceof的调用。这比实际需要的开销更多。缺点2:如果第2个和第3个参数被交换,hashcode方法会被破坏,因为它会生成相同的值。@SME\u Dev如果您想硬编码查找,那么请务必使用枚举,但是如果这些值在任何时候都要更改,或者如果这不是每秒100秒执行的操作,你提到的开销对于灵活性来说是一个很小的代价。我知道它吹毛求疵,但是在一个弱小的android设备上,这些都是不同之处,它们可以使应用程序平稳运行,或者滞后。顺便说一下:枚举也不是最终的解决方案,因为您最终将迭代所有选项。对于一个巨大的列表,它们比通过hashfunction计算索引要慢得多。