2017-02-05 1 views
3

Название немного запутанно. Но позвольте мне объяснить мою проблему.Доступ к карте Haxe с помощью ключей объектов с использованием нового ключа с таким же значением

Предположим, что у вас есть класс под названием MyObj. Этот MyObj имеет функцию hashCode(), которая создает хэш-код Int для работы с картами Haxe в качестве ключа. Например:

var mymap = new Map<MyObj,String>(); 
var myobj = new MyObj(my,params); 
mymap[myobj] = "whatever"; 
trace(mymap[myobj]); // works great and can print "whatever" from map 

Вышеупомянутые работы отличные. Однако; при сопоставлении с новым объектом с теми же параметрами он не работает.

trace(mymap[new MyObj(my,params)]); // does not work, returns null 

При распечатке и рассматривая всю карту (trace(mymap)), кажется, что каждый «новый» объект, который используется в качестве ключа на самом деле новый «идентификатор» или «хэш-код» (то, что когда-либо Haxe делает под капот).

У меня даже есть оператор равенства, перегруженный в MyObj (который может быть абстрактным).

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

, как сделать что-то вроде этой работы:

mymap[new MyObj(my,params)] 

ответ

3

Чтобы предложить альтернативу ответу @ theRemix: вы можете рассмотреть возможность использования библиотеки polygonal-ds. Он поддерживает то, что вы используете, через его HashTable и интерфейс Hashable. Вот простой пример использования:

import de.polygonal.ds.HashTable; 
import de.polygonal.ds.Hashable; 

class Main { 
    public static function main() { 
     var table = new HashTable<MyObj, String>(16); 
     table.set(new MyObj(5), "FirstObject"); 
     table.set(new MyObj(2), "SecondObject"); 

     trace(table.get(new MyObj(5))); // "FirstObject" 
     trace(table.get(new MyObj(0))); // null 
    } 
} 

class MyObj implements Hashable { 
    public var key(default, null):Int; 

    public function new(key:Int) { 
     this.key = key; 
    } 
} 

Существует один недостаток: HashTable класс, а не абстрактный, поэтому он не поддерживает доступ к массиву.

1

Разве вы не должны использовать haxe.ds.HashMap вместо Map для hashCode работать?

+0

hmm хэш-код, похоже, работает с обычной картой; однако попробует HashMap – efel

+0

Нет использования haxe.ds.HashMap даже не компилируется, потому что объект имеет абстрактный тип с равными перегруженными и все – efel

1

Поскольку это отдельные отдельные объекты, такое поведение ожидается. Для достижения желаемого поведения можно

Создать новый абстрактный тип из Map<MyObj,String>, внутренне Map<String,String>, когда вы определяете аксессор, сериализация и десериализация ключа объекта.

+0

, что позорно это делается в haxe .. Я почти рассматриваю просто используя простой int в качестве ключа, например: вызов hashCode() вручную. – efel

Смежные вопросы