0

DICT用語を表し、Erlangプロセスに渡されてerlang用語(string-to-term)として反映される文字列をJavaで作成したいと思います。

ORDDICTは、次のようなタプルのリストで単純にソートされたキーと値のペアとして構造化されているため、これを簡単に実現できます。[{field1、 "value1"}、{field2、 "value2}]

ただし、DICTSの場合、それらは特定の用語にまとめられており、リバースエンジニアリングの方法を見つけたいと思います。この構造は新しいリリースで変更される可能性があることは承知していますが、パフォーマンスとJavaへの統合の容易さのメリットはこれを克服します。残念ながら、ErlangのJInterfaceは単純なデータ構造に基づいています。効率的なDICTタイプは非常に役立ちます。

単純なdictは次のように定義されます。

D1 = dict:store("field1","AAA",dict:new()).
{dict,1,16,16,8,80,48,
  {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
  {{[],[],[],[],[],[],[],[],
    [["field1",65,65,65]],
    [],[],[],[],[],[],[]}}}

上で見られるように、私がそれらが何を意味するのか理解できないいくつかの座標があります(数字1,16,16,8,80,48と空のリストのセット。これも何かを表している可能性があります。

他の2つの行(キーと値のペア)を追加すると、データは次のようになります。

D3 = dict:store("field3","CCC",D2).
{dict,3,16,16,8,80,48,
  {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
  {{[],[],
    [["field3",67,67,67]],
    [],[],[],[],[],
    [["field1",65,65,65]],
    [],[],[],[],
    [["field2",66,66,66]],
    [],[]}}}

上記から私はそれに気付くことができます:

  • 最初の数字(3)は、DICT内のアイテムの数を表します。
  • 2番目の数字(16)は、リストの最初のタプル内のリストスロットの数を示します
  • 3番目の数値(16)は、リストの2番目のタイプのリストスロットの数を示し、そのうちの値は最終的に(中央に)配置されます。
  • 4番目の数値(8)は、値が配置されるタプルの2番目の行のスロットの数であるように見えます(一種のインデックスポインター)。
  • 残りの数(80と48)...わからない...
  • キー「field0」を追加すると、最後ではなく「field1」のデータの直後に配置されます。これは、インデックス作成のアプローチを示しています。

それで、質問は、Erlangの外部からDICT文字列を確実に直接作成する方法(アルゴリズム)はありますか?

4

1 に答える 1

1

The comprehensive specification how dict is implemented can be found simply in the dict.erl sourcecode.

But I'm not sure replicating dict.erl's implementation in Java is worthwhile. This would only make sense if you want a fast dict like data structure that you need to pass often between Java and Erlang code. It might make more sense to use a Key-Value store both from Erlang and Java without passing it directly around. Depending on your application this could be e.g. riak or maybe even connect your different language worlds with RabbitMQ. Both examples are implemented in Erlang and are easily accessible from both worlds.

于 2013-03-26T16:20:49.680 に答える