我有一个带有一堆MyObject对象的ArrayList。我想在我的对象中保留一个整数字段,这是ArrayList中该对象的关键字,这样我就可以轻松地在ArrayList中获取该元素的位置。
当我从此ArrayList中删除一个对象时会出现问题,因为索引会向左移动。避免这个问题的最佳方法是什么?
我是否应该删除元素,但是使用null覆盖它们(以便索引不会移位)或者我应该在删除一次后更新迭代ArrayList以更新对象中的所有ID字段?
//编辑:我的目的:让我说我得到那个ArrayList的一些对象并将它们插入另一个列表中。稍后当迭代第二个列表时,我想获得第一个ArrayList中对象的键。所以我必须将密钥保存在对象上。在这种情况下使用Map时的好处在哪里?键只是自动递增整数。
答案 0 :(得分:3)
这可以使用地图 - 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);
地图上的每个关键字都是唯一的,因此,如果您更改了该值,则不会影响该关键字。
在这种情况下,您可以存储具有空值的键。
否则,如果删除索引并重新放置,将解决:
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));
}
但我认为将它映射到你想要的东西。第二种方法它不是线程安全的,并且会在并发线程的情况下导致崩溃
答案 1 :(得分:2)
你最好使用Map。 Map是将键映射到值的对象。它不能包含重复的键;每个键最多可以映射一个值。
因此,在您的情况下,您可以将id和对象存储为地图中的键值对。从那里你可以直接访问相关id的对象。