1

プログラムを作成しているときに、作成したいくつかのオブジェクトに一意の ID を割り当てる必要があるというこの要件に遭遇しました。今、私は GUI でオブジェクトを動的に作成しています。最初は単純なカウンターを使用して、作成されたノードに int 値を割り当てましたが、問題なく動作しました。

ただし、このアプローチが引き起こす問題は、GUI の作成中にノードを削除する必要がある場合、この ID も削除され、二度と使用されないことです。次の新しいノードでは、毎回最新のカウンター値を使用する必要があり、プロセス中にノードが削除されると、多くの欠落した int 値が作成されます。

新しいノードの作成時に不足している ID を再利用したかったので、どのアプローチを採用すべきか混乱しています。

私のアイデア:

  1. 使用可能な値を含む ArrayList を使用し、さらにノードが削除された場合は、その ID がこのリストに追加されます。このリストを並べ替えて、新しいノードの最小値を使用します。結構ですが、この値を使用すると、リストから削除すると、インデックスが削除されず、問題が発生します。
  2. HashMap、上記と同様に、使用可能な ID を追加し、使用されていないものを削除しますが、この hashMap をソートする方法がわかりませんか???

どうすればいいのか教えてもらえますか?値をプッシュし、ソートし、最小値を使用できるスタックが必要な場合があります。使用した場合、このスタックから削除されます。このタスクを達成する方法についていくつかのアイデアを教えてください???

4

4 に答える 4

4

削除された ID のリストを保持し、新しいノードを作成するときに、そのリストを確認して再利用する ID を確認します (どちらを使用してもかまいません)。リストが空の場合 (最初はそうであるように)、新しい ID を「古い方法」で取得します。さらに賢い方法: リストに削除された ID がない場合に新しい ID を生成するオブジェクトをリストに作成すると、呼び出し元は ID がどのように到達したかを気にする必要がなくなります。

于 2012-04-18T14:15:59.577 に答える
3

TreeSet(追加されたすべてのエントリを最小から最大に自動的にソートする) を使用して、削除された ID ( ) を保存できますmyTreeSet.add(old_id)TreeSetそうすれば、新しいインスタンスを作成するときに、最初のインスタンスにエントリがあるかどうかを確認できます。最低値を取得するには、myTreeSet.first()(操作である必要がありO(1)ます) を使用します。が空の場合、TreeSetつまり既知のすべての ID が現在使用されていることを意味し、次に使用可能な ID を通常どおり使用します。

于 2012-04-18T14:14:39.647 に答える
1

TreeSet使用済みIDの保管にいかがでしょうか?を使用higher(0)して、最も低い空き ID を見つけることができます。が返された場合null、使用済みの ID がないことがわかります。

于 2012-04-18T14:18:12.150 に答える
0

最初の解決策は、ノードが少ない場合にのみうまく機能します! 数千のノードを持つアプリケーションを想像してみてください! メモリ消費はどうですか?Hashmap ソリューションは目的に適しており、必要なコントロールが少なくて済みます。

于 2012-04-18T14:17:27.657 に答える