Структура данных для хранения пар ключей и значений в Java - PullRequest
2 голосов
/ 17 ноября 2010

Добрый вечер,

Я ищу элегантное решение для реализации таблицы переходов (в частности, для универсального автомата нажатия), которое использует несколько дискретных значений для данного перехода.Говорят, что картинка стоит тысячи слов, поэтому вот часть моей таблицы:

State    InputSymbol    StackSymbol   Move(NewState, Action)
------------------------------------------------------------
  0           a              Z0           (0, push)
  0           a              a            (0, push)
  0           a              b            (0, pop)
  0           b              Z0           (1, push)
  ...

Теперь я рассмотрел многомерные массивы, ArrayLists of ArrayLists и другие подобные решения, но все кажутся довольнобессмысленны.Это еще более осложняется тем фактом, что каждая возможная комбинация моих трех символов (a, b и Z0) не представлена ​​в таблице.

Я размышлял об использовании HashMap, но я не совсем уверенкак заставить это работать с несколькими значениями ключа.Я рассматривал объединение всех трех символов вместе и использование результирующей строки в качестве моего ключа, но это тоже кажется не совсем элегантным.

И, к сведению, это домашняя работа, но на самом деле дать элегантное решение не совсемтребуется.Мне просто нравится хороший код.

Заранее благодарю за помощь.

Ответы [ 3 ]

4 голосов
/ 17 ноября 2010

Создайте такой класс:

 class Key{
    int state;
    char inputSysmbol;
    String StackSymbol;
    }

Тогда используйте карту Map<Key,Move>.

Создайте класс для Move, как описано выше, и не забудьте переопределить хэш-код и метод в обоих классах.

1 голос
/ 17 ноября 2010

Инкапсуляция {State, InputSymbol, StackSymbol} в объекте. Затем используйте «hashcode ()» объекта в качестве ключа для вашей хеш-таблицы. Для получения дополнительной информации о хэш-кодах см. Doc .

0 голосов
/ 17 ноября 2010

Взгляните на MultiHashMap из фреймворка коллекций общин Джакарты.http://commons.apache.org/collections/api-release/org/apache/commons/collections/MultiHashMap.html

К сожалению, фреймворк коллекции Джакарты не параметризован, то есть не поддерживает дженерики, поэтому вам придется приводить вас к вашему конкретному типу.

Другое решение - реализовать нечто подобное себе.Создайте класс Move, который содержит ваши данные.Создайте класс Table, который инкапсулирует логику.Этот класс может содержать список (лучше LinkedList) Moves и N map: Map> stateIndex Map> inputSymbolIndex и т. Д. И т. Д.

Реализация метода add тривиальна.Реализация get более интересна:

public Move get(Integer state, Character inputSymbol, StackSymbol stackSymbol) {
    List<Move> stateList = stateIndex.get(state);
    List<Move> inputSymbolList = stateIndex.get(inputSymbol);
    List<Move> stackSymbolList = stateIndex.get(stackSymbol);

    Set<Move> result = new HashSet<Move>(stateList);
    result.retainAll(inputSymbolList);
    result.retainAll(stackSymbolList);

    if (result.size() > 1) {
        throw new IllegalStateException("Unique constraint violation");
    } 
    return  result.size() == 0 ? null : result.interator().next();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...