Различные варианты использования HashMap - PullRequest
1 голос
/ 25 января 2011

Я знаком с HashMaps уже много лет. В Java я использую их как ассоциативные массивы, в ActionScript я использовал их для нескольких интересных трюков (см. Пример ниже). Довольно редко мне нужно использовать Object в качестве ключа, и мне было интересно, есть ли у кого-нибудь интересные примеры, где вы используете HashMaps с Object в качестве ключей. Пожалуйста, ответьте на выбранном вами языке, этот вопрос не о каком-либо конкретном языке.

Мне хорошо известно, что в некоторых языках String, Int и т. Д. Являются объектами

ActionScript Пример: Сохраняет значения, связанные с объектом, без изменения интерфейса объекта.

var s:Sprite = new Sprite();
// dictionary is like a HashMap in AS
var lookup:Dictionary = new Dictionary();
lookup[s] = someValue;
s.addEventListener(MouseEvent.CLICK, onClick);
function onClick(evt:Event):void{
  trace(lookup[evt.currentTarget]);
}

Ответы [ 2 ]

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

Зависит от определения равенства ключей. Если равенство означает идентичность объекта (тот же адрес памяти), тогда подойдет любой объект. Если равенство ключей зависит от внутреннего состояния объектов, то большинство библиотек предлагают, чтобы вы предоставили осмысленную реализацию hash(). Python также должен знать, что объекты, используемые в качестве ключей, неизменны , поэтому инварианты не могут быть нарушены путем модификации ключа после его добавления на карту. Питонское определение равенства относительно ключей глубоко сравнивается. В других языках / библиотеках неотъемлемые требования к инвариантам, равенству, хэшированию и неизменности одинаковы, но они не применяются.

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

Я обычно использую объекты-значения в качестве ключей, когда у меня есть сложный ключ;это было бы аналогично первичному ключу в таблице базы данных с более чем одним столбцом.Например, предположим, что у вас есть курс колледжа с несколькими разделами.В Java у вас может быть объект значения, такой как:

class Section {
   private String courseName;
   private int sectionNumber;
   ...
} 

с getter, setters, equals () и hashCode ().Потенциально у вас могут быть и другие свойства для объекта значения, но если с помощью этих двух свойств записаны equals и hashCode, вы можете использовать Section в качестве ключа карты.

Я видел, как некоторые люди просто объединяли поляони хотят получить ключ в строку, например String key = course + Integer.toString(section);, но, насколько я понимаю, гораздо более выразительно использовать map.put(section, students), чем map.put(section.getCourseName() + Integer.toString(section.getSectionNumber())).

...