Java HashMap Повторяющиеся записи корзины - PullRequest
1 голос
/ 31 октября 2011

У меня есть вопрос о HashMaps.Мы пишем маленький (-ish) компилятор и для этого мы используем таблицу символов.Мы реализуем это с помощью хэш-карты.

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

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

Учитывая следующий фрагмент кода:

{ 
    a = 5;
    {
        a = 5;
    }
}

Примет ли это хэш-карта?Например, я бы ввел их, используя в качестве ключа.Это не будет проблемой, но при появлении и удалении их сможет ли Java сделать разницу между двумя объектами?Или второй перезапишет первый?

Ответы [ 4 ]

3 голосов
/ 31 октября 2011

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

1 голос
/ 31 октября 2011

Я хочу предложить вам 2 решения.

  1. Пользовательские карты карт.Вот как работает JNDI.Каждое пространство имен может содержать сами переменные и подконтекст, который является самой картой и может содержать переменные своего уровня.
  2. Используйте точечную запись для ключей.Что-то вроде 1.a для первой переменной a, определенной во внешнем контексте, и 1.1.a для второй.
1 голос
/ 31 октября 2011

Нет, это не сработает, потому что у вас может быть только одно значение для данного ключа на карте.

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

1 голос
/ 31 октября 2011

Карта javadoc

Объект, который сопоставляет ключи со значениями. Карта не может содержать дубликат ключи ; каждая клавиша может отображать не более одного значения.

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