1

一連の MyObject オブジェクトを含む ArrayList があります。ArrayList 内のこのオブジェクトのキーである整数フィールドをオブジェクトに保持したいので、ArrayList 内のこの要素の位置を簡単に取得できます。

インデックスが左にシフトされるため、この ArrayList から 1 つのオブジェクトを削除すると問題が発生します。この問題を回避する最善の方法は何ですか?

要素を削除するのではなく、(インデックスがシフトされないように) null でオーバーライドする必要がありますか、それともオブジェクトのすべての ID フィールドを更新するために、1 つの削除後に ArrayList を反復処理する必要がありますか?

//編集: 私の目的: その ArrayList のいくつかのオブジェクトを取得し、それらを別のリストに挿入するとしましょう。後でその 2 番目のリストを反復処理するときに、最初の ArrayList 内のオブジェクトのキーを取得したいと考えています。したがって、キーをオブジェクトに保存する必要があります。その場合、マップを使用する利点はどこにありますか? キーは自動インクリメント整数のみです。

4

2 に答える 2

3

これは Map - HashMapを使用して可能です

例:

Map<Integer, MyObject> map = new HashMap<Integer, MyObject>();
MyObject obj = new MyObject();
Integer key = new Integer("1234");
obj.setKey(key);
map.put(obj.getKey(), obj);

オブジェクトを取得するには、次を呼び出します。

MyObject result = map.get(key);

result = null;

map.put(key, result);

すべてのキーはマップ上で一意であるため、値を変更してもキーには影響しません。

この場合、null 値を持つキーを格納できます。

それ以外の場合、インデックスを削除して再度配置すると、次のように解決されます。

        List<String> list = new ArrayList<String>();
        list.add("ONE");
        list.add("TWO");

        for (int index = 0; index < list.size(); index ++) {
            // remove the index that you will change to null
            list.remove(index);
            // put a null object in that index
            list.set(index, null);
            System.out.println(list.get(index));
        }

しかし、マップはあなたが探しているものだと思います。この2番目のアプローチはスレッドセーフではなく、同時スレッドの場合にクラッシュを引き起こします

于 2013-05-24T19:35:59.590 に答える
2

Mapを使用することをお勧めします。Map は、キーを値にマップするオブジェクトです。重複キーを含めることはできません。各キーは、最大で 1 つの値にマップできます。

したがって、あなたの場合、IDとオブジェクトをキー、値のペアとしてマップに保存できます。そこから、関連する ID のオブジェクトに直接アクセスできます。

于 2013-05-24T19:31:13.503 に答える