ときどき、ユーザーが手動で並べ替えることができる要素のリストを処理する必要があります。
ほとんどの場合、順序に依存するコンテナーを使用するモデルに依存しようとしますが、これが常に可能であるとは限らず、データに位置フィールドを追加する必要があります。この位置フィールドは double 型であるため、常に 2 つの数値間の位置を計算できます。ただし、これは理想的ではありません。これは、2 つの数値の間に挿入を続けるのに十分な数値精度がないエッジ ケースに到達することを懸念しているためです。
ポジション番号を維持するための最善の方法について疑問があります。最初の考えは、すべての行をトラバースし、挿入ごとにラウンド番号を与えることです。次のようにします。
2 と 3 の間の行を削除した直後:
1 2 2.5 3 4 5
位置番号の更新後:
1 2 3 4 5 6
もちろん、エントリ数が多いと重くなる可能性があります。特にメモリ内ではなく、すべての新しい値をディスク/データベースに保存します。私は通常、ある種の ORM とモバイル ソフトウェアを扱っています。すべてのコードを更新すると、すべてのオブジェクトがディスクから取り出され、ダーティとして設定され、データ モデルの関連するすべての検証ルールが再検証されます。
2 つの位置の間の数値を計算するのに十分な精度が得られなくなるまで待つこともできます。ただし、同じ操作に同じ時間を必要としないため、ユーザー エクスペリエンスは低下します。
これらのケースには、位置番号を定期的かつ一貫して更新する標準アルゴリズム、またはそれらの一部だけがあると思います。理想的には、最悪のケースと最良のケースの間に大きな時間差がなく、O(log n) である必要があります。
正直なところ、ユーザー/ソートする必要があるものは、最悪の場合に実際の問題になるほど大きくなることはないと思います。エッジケースも非常にまれであるように思われ、境界番号をプッシュするソリューションを検索するとなおさらです。ただし、この問題には、私が気付いていない標準的なよく知られた解決策があると今でも信じており、それについて学びたいと思っています。