2016-08-07 10 views
0

これは重複している可能性がありますが、私が欲しいものを検索するための正しい用語を知らないので、これが完全で具体的ではない。Javaは、この特定のケースでオブジェクトをマップする最良の方法

これは私のシナリオです:

私はObjectAにし、ObjectBにそれらを呼び出す、私はお互いにマッピングするオブジェクトの2つの異なるタイプがあります。これらのオブジェクトはforループで生成されます。私は反復の各インスタンスを別のインスタンスにマッピングする必要があります。 ObjectA(1) - ObjectB(1)、ObjectA(2) - ObjectB(2)など。そして、マップするためにおよそ500〜3000のエントリがあります。

この理由は、いくつかのメソッドがObjectAに渡され、対応するObjectBを取得する必要があり、逆もまた同様です。私は参照として最初のループインデックスを使用することはできません、ただオブジェクトの1つである必要があります。

私はGuava HashBiMapを使用しようとしましたが、いくつかの理由でそれを好きではありません。 1)これは、私がGuavaクラスを使用する唯一のインスタンスであり、必ずしも私のパッケージに〜500kbを追加する必要はありません。 (これはモバイルアプリケーションのため、それを小さくしようとしています)、2)フレームごとにオブジェクトを反復処理する必要があり、keySet()を繰り返し実行すると大きなメモリ割り当てが行われていました。私はこれを回避する方法があると確信していますが、それはおそらくちょっとした間違いでしたが、まだ理由はありません。

インデックスがマップされていることを知っているので、現在の解決策は2 ArrayList'sまたは実際にはlibgdxの配列ですが、論理を理解する目的でArrayListをとることができます)、私は単純に行います。

ObjectA objectA = objectAList.get(objectBList.indexOf(objectB)); 

そしてその逆。

とにかく、私はこの解決策が気に入らず、高価だと感じています。私は確かにはるかに簡単で高速な方法があると確信しています。

ありがとうございました!

+0

あなたは 'ObjectA'インスタンスが何' ObjectB'インスタンスにマッチするものを知っている方法についてのより完全な例/説明を提供することができますか?彼らは共有プロパティを持っていますか? – Mureinik

+0

forループで一緒に作成されているだけです。したがって、私が別のArrayの説明どおりに配置した場合、私はobjectAList.get(4)がobjectBList.get(4)にマップされていることを知っています。 – hamham

+0

ObjectBのequals()とhashode()が効果的な方法で実装されている場合、 'ObjectA objectA = objectAList.get(objectBList.indexOf(objectB)) 'という検索は可能な限り高速です:O(1)* 2。おそらく、ループ中に最適化を行うことができるかもしれません。 コードを表示できますか? – davidxxx

答えて

0

これはあなたにとって役に立ちます。 BidiMap uが探しているメソッドをこのインタフェースを実装している

https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/BidiMap.html

クラスと呼ばれるのApache Commonsのコレクションのインターフェイスがあります。私は価値の鍵を得ることを意味し、逆もまた同様であり、このパッケージの重量は約150kbです。

よろしく

関連する問題