Реализация своего рода пары ключ-значение (по сути, не HashMap) в Java - PullRequest
3 голосов
/ 20 января 2011

Каков наилучший способ реализовать следующий сценарий в 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 может быть лучший способ.

Ответы [ 3 ]

2 голосов
/ 20 января 2011

Способом достижения этой цели может быть тройная вложенная хэш-карта.Или hashmap hashmaps hashmaps.

Псевдо-код для запроса будет выглядеть примерно так:

//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, вы получите возвращаемое значение 1.
Если вы искали key1, *, *, вы получите значение1 и возвращенное значение2.

Обновление:
Когда вы вызываете query ("key1", "", "key3");
Так как param1 действителен (не подстановочный знак), мы вызываемsubquery1 (hashmap ["key1"], "
", "key3");
Прежде чем мы перейдем к подзапросу1, оценивается hashMap ["key1"], но он возвращает другой hashmap,
позволяет вызватьэто hashmap hashmap2 [].Таким образом, подзапрос1 фактически вызывается с помощью (hashmap2 [], "*", "key3");

Теперь мы находимся в подзапросе 1.
Поскольку param2 равен "*", мы затем перебираем все значения hashmap2 [],
для каждого hashmap3 [] в hashmap2 [], мы вызываем subquery3(hashmap3 [], "key3");

На этом этапе, поскольку param3 действителен, мы вызываем hashmap3 ["key3"] и получаем значение value1;

0 голосов
/ 20 января 2011

Вы должны использовать trie для представления значений. Это позволит вам быстро и легко перемещаться по структуре, а также быстро управлять вашими любыми и не условиями. Вы можете найти один здесь .

0 голосов
/ 20 января 2011

Похоже, что у вас есть / нужно NFA, где ваши параметры являются символами.

http://en.wikipedia.org/wiki/Nondeterministic_finite-state_machine

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...