2

ソートされた(Mongodb)オブジェクトのコレクションがあります:

{"_id": ObjectId(...), "person": "Homer", "order": 1},
{"_id": ObjectId(...), "person": "Marge", "order": 2}

2つのオブジェクトの間に別のオブジェクトを追加、追加、または挿入したいと思います。私は次のような浮動小数点数を使用してこれを試しました:

{"_id": ObjectId(...), "person": "Homer", "order": 1},
{"_id": ObjectId(...), "person": "Bart", "order": 1.5},
{"_id": ObjectId(...), "person": "Marge", "order": 2}

順序値はorder、前のオブジェクトと次のオブジェクトのフィールドの算術平均です。数字がのように見えない限り、機能します1.9999999。次に、2に丸められ、コレクションはソートされません。私はこのように整数を使うことができます:

{"_id": ObjectId(...), "person": "Homer", "order": 1},
{"_id": ObjectId(...), "person": "Bart", "order": 2},
{"_id": ObjectId(...), "person": "Marge", "order": 3}

しかし、それは他のオブジェクトを変更する必要があることを意味し、私はむしろそれを避けたいと思います。

順序を防ぐために文字列と字句ソートを使用することを考えました。

{"_id": ObjectId(...), "person": "Homer", "order": aa},
{"_id": ObjectId(...), "person": "Bart", "order": ab},
{"_id": ObjectId(...), "person": "Marge", "order": bb}

しかし、実装するのは難しいようです。それを行う簡単な方法はありますか?

4

1 に答える 1

2

フロートアプローチが最も理にかなっていると思います。すべての場所を整数として開始すると仮定すると、精度の問題が発生するまで、多くのスワップが必要になります。

アイテムの「順序」を変更するときはいつでも、そのアイテムが隣接するアイテムの1つに近すぎるかどうかを確認することをお勧めします。そうである場合は、すべてのオブジェクトの値を再割り当てします(したがって、それらはすべて整数になります)。

|xy|の制限を設定した場合 > = 2 **(-50)、これはpythonがfloat用に53の高精度ビットを保持しているため問題ありません。注文を再割り当てする必要がある前に、少なくとも50の不運なスワップが必要です。

編集:Pythonについて具体的に質問していないのを見たばかりです。精度をシステムにとって意味のあるものに置き換えます。

于 2012-07-27T15:34:31.020 に答える