0

次の場合、アイテムをリストに保持するためにどの方法を使用する必要がありますか?

  1. アイテムのリストを含むオブジェクトがあり、それらのアイテムに対してアクションを実行できます
  2. これらのアイテムはリスト内で並べられています
  3. リスト内の項目の位置を変更し、ID に基づいて項目を追加または削除できる必要があります。
  4. リストは最終的にデータベースに保存されます (そして、アイテムはこのリスト内での順序を維持する必要があります)
  5. 順序付けされた項目に「順序」プロパティを設定しても意味がありません (これらのオブジェクトは複数の種類のリストに含まれる可能性があります)。

私が持っている選択肢(他に選択肢はありますか?):

  1. List オブジェクトを使用すると、順序が自動的に維持されます。しかし、ID でオブジェクトを見つけるには、(最悪の場合) すべてのオブジェクトをループ処理する必要があります。
  2. キー/値 (オブジェクト ID / オブジェクト) を持つマップを使用すると、オブジェクトを簡単に (そして高速に) 取得し、オブジェクトの順序 (オブジェクト ID / オブジェクトの順序) を保持する別のマップを保持できます。

解決策 #1)これは、パフォーマンス上の欠点を伴う最も簡単な解決策のようです。

解決策 #2)これは最速の解決策のように思えますが、リストを並べ替えるときにより多くのコードが必要になります。

順序付けられ、キー/値のペアを持ち、object.add(index, key, value) または object.getByIndex(index) または object.getByKey(key) のようなメソッドを持つ、私が知らないオブジェクトはありますか?

4

2 に答える 2

1

提案されているようRoniに、独自のデータ構造を使用する必要があります。それがあなたの要件を満たす唯一の実行可能なオプションだと思います.

私はあなたの要件を満たすためにサンプルをstarting point作成しました。あなたはそれに基づいて構築することができます.

public class MapAndList {

    private List<String> keys = new ArrayList<String>();
    private Map<String, Object> keyValuePair = new HashMap<String, Object>();

    public void addItem(String key, Object item) {
        // TODO if the key is already present in the list throw exception
        keys.add(key);
        keyValuePair.put(key, item);
    }

    public void removeItem(String key) {
        keys.remove(key);
        keyValuePair.remove(key);
    }

    public void removteItem(int index) {
        removeItem(keys.get(index));
    }

    public void addItem(String key, Object item, int index) {
        keys.add(index, key);
        keyValuePair.put(key, item);
    }

}

これがお役に立てば幸いです....

于 2012-08-17T04:01:18.827 に答える
0

アイテムが重複しない場合は、indexOf() メソッドを使用してオブジェクトのインデックスを取得し、get(int Index) を使用してオブジェクトに直接アクセスできます。

また、Item オブジェクトの equals メソッドをオーバーライドして、ID に基づいて比較を返すため、ID ベースの再試行が行われます。

indexOf メソッドのソースコードをチェックしただけで、リスト全体のみを反復処理します:(

于 2012-08-17T03:50:23.937 に答える