создание объекта равенства "HashMap" в ActionScript3 в виде Java HashMap - PullRequest
0 голосов
/ 25 декабря 2010
const jonny1 : Person = new Person("jonny", 26);
const jonny2 : Person = new Person("jonny", 26);

const table : Dictionary = new Dictionary();
table[jonny1] = "That's me";

trace(table[jonny1]) // traces: "That's me"
trace(table[jonny2]) // traces: undefined.

Но я хочу использовать словарь следующим образом:

trace(table[jonny2]) // traces: "That's me".

одним словом, я хочу реализовать структуру данных, такую ​​как HashMap в Java

Ответы [ 3 ]

3 голосов
/ 25 декабря 2010

Я не считаю вы можете использовать Dictionary таким образом.Из документации:

Класс Dictionary позволяет создавать динамический набор свойств, который использует строгое равенство (===) для сравнения ключей на непримитивных объектных ключах.Когда объект используется в качестве ключа, идентификатор объекта используется для поиска объекта, а не значение, возвращаемое из вызова toString () для него.

Обратите внимание на ссылки на строгий равенство и идентичность объекта.

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

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

Возможно, вы также захотите взглянуть на ассоциативные массивы .

(Это все только на основе небольшого исследования, хотя я никогда на самом деле сделано любой ActionScript, так что возьмите все с щепоткой соли.)

2 голосов
/ 25 декабря 2010

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

Напротив, Объект может использоваться как карта, где ключи являются строками. Это означает, что при добавлении сложного объекта в качестве ключа эти объекты toString () будут вызываться и использоваться в качестве ключа на карте. В вашем примере вы можете добавить реализацию toString () к вашему классу Person, в которой перечислены все свойства, которые (вместе) делают человека уникальным.

Рассмотрим метод toString ():

public function toString():String {
  return "[Person(name:" + name + ", age=" + age + ")]";
}

Если вы затем запустите следующий тест, он пройдет:

public function testMap():void {
  var jonny1:Person = new Person("jonny", 26);
  var jonny2:Person = new Person("jonny", 26);

  var map:Object = {};
  map[jonny1] = "That's me";

  assertEquals("That's me", map[jonny2]); // succeeds
}

И если вы посмотрите на экземпляр карты с помощью отладчика, вы увидите:

map:Object
  [Person(name:jonny, age:26)] : That's me

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

1 голос
/ 25 февраля 2011

Я написал фреймворк коллекций под названием as3-collection , который дает вам больший контроль над равенством объектов и хешированием объектов.Проверьте https://github.com/danschultz/as3-collections для получения дополнительной информации.

...