2017-02-05 7 views
3

タイトルはちょっと混乱します。しかし、私の問題を説明させてください。新しい値キーを使用したオブジェクトキーによるHaxeマップアクセス

MyObjというクラスを持つようなふりをしましょう。 MyObjにはhashCode()という機能があり、Haxeマップをキーとして使用するためのIntハッシュコードを生成します。ように:

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))を調べることがキーとして使用されているすべての「新しい」オブジェクトが実際に新しい「ID」または「ハッシュコード」であると思われる(haXeのは下行い、これまで何フード)。

さらに、等価演算子のオーバーロードがMyObj(抽象タイプになる可能性があります)になっています。

質問は、上記のように同じ値を含むさまざまなオブジェクトを使用してマップから要素を取得するにはどうしたらよいですか。

mymap[new MyObj(my,params)] 

答えて

3

@ theRemixの回答の代わりに、polygonal-dsライブラリの使用を検討してください。それは、HashTableHashableインターフェイスを介してあなたの後ろのものをサポートしています。ここでは簡単な使用例を示します。

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; 
    } 
} 

1つの欠点があります:HashTableはクラスではなく、抽象的なので、配列アクセスをサポートしていません。

1

は、あなたが仕事にhashCodeためhaxe.ds.HashMapの代わりMapを使用する必要はありません。

はどのようにこの作品のようなものを作るには?

+0

hmmハッシュコードは通常のマップで動作するようです。ただし、ハッシュマップを試してみる – efel

+0

haxe.ds.HashMapを使用していないのは、オブジェクトがequalsがオーバーロードされた抽象型であり、すべてが – efel

1

これらは個別の個別のオブジェクトなので、この動作が期待されます。 アクセッサを定義し、オブジェクトキーをシリアライズしてデシリアライズするときに、Map<MyObj,String>から新しい抽象タイプ(Map<String,String>)を内部的に作成します()。

+0

というhaxeでこのようにしなければならないということだからです。単純なintをキーとして使用します。たとえば、hashCode()を手動で呼び出します。 – efel

関連する問題