在Java中实现以下方案的最佳方法是什么:

一种键值对机制,但是看起来像这样:

param1 + param2 + param3 -> output1
param1 + * + !param3 -> output2
param1 + text containing value param2 + * -> output3

'*' => any parameter
!param => any value other than this parameter
text containing value 'param' => any data which contains the value 'param'. ex: aaaaa,bbb,param,ccc or aaaparambbb

在我看来,HashMap使实现这种类型的映射变得困难。实现这样的映射的最佳方法是什么?
我还考虑将它们放在Oracle表中并尝试编写过程,但是Java中可能有更好的方法。

最佳答案

实现此目的的一种方法可能是三层嵌套的哈希映射。或哈希图的哈希图的哈希图。

用于查询的伪代码类似于以下内容:

//You would call this method to search.
string query(string param1, string param2, string param3)
{
    // The essence of the logic is, if you give a value for param3,
    // then it will do the subquery of the hashMap that param3
    // is the key of, if you don't supply a value (or provide the wildcard)
    // it will search all the different hashmaps of the parent hashmap.
    // See below for an example
    if param1 != WILDCARD
    then subquery1(hashmap[param1], string param2, string param3);
    else for each x in hashmap, subquery1(x,string param2, string param3)
}

string subquery1(hashmap[hashmap[]] maps, string param2, string param3)
{
    // The essence of the logic is, if you give a value for param2,
    // then it will do the subquery of the hashMap that param2
    // is the key of, if you don't supply a value (or provide the wildcard)
    // it will search all the different hashmaps of the parent hashmap.
    if param2 != WILDCARD
    then subquery2(maps[param2], string param3);
    else for each x in maps, subquery2(x, string param3)
}

string subquery2(hashmap[] maps, string param3)
{
    if param3 != WILDCARD
    then return maps[param3]
    else for each x in maps, return maps[param3]
}

显然,您需要定义是否允许返回多个值,以及如何解决此问题。您还需要确定参数3是否可为空?问题陈述含糊不清,但我已尽力回答我认为您的问题所在。

例如,如果您将以下值添加到哈希图中。
key1,key2,key3 = value1
key1,key2,key4 = value2
如果搜索key1,*,key3,则将返回value1。
如果搜索key1,*,*,则将得到value1,并返回value2。

更新:
当您调用query(“key1”,“”,“key3”);
由于param1有效(不是通配符),因此我们调用subquery1(hashmap [“key1”],“”,“key3”);
在进入subquery1之前,先对hashMap [“key1”]进行评估,但它会返回另一个hashmap,
让我们将此哈希表称为hashmap2 []。因此,实际上使用(hashmap2 [],“*”,“key3”)来调用subquery1;

现在我们在subquery1中。
由于param2为“*”,因此我们遍历hashmap2 []的所有值,
对于hashmap2 []中的每个hashmap3 [],我们将其称为subquery3(hashmap3 [],“key3”);

此时,由于param3有效,我们调用hashmap3 [“key3”]并返回value1;

关于java - 在Java中实现某种键值对(本质上不是HashMap),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4743731/

10-11 02:32