Java 更新对象中的ArrayList索引

Java 更新对象中的ArrayList索引,java,arraylist,indexing,Java,Arraylist,Indexing,我有一个ArrayList和一堆MyObject对象。我想在我的对象中保留一个整数字段,它是ArrayList中这个对象的键,这样我就可以很容易地得到这个元素在ArrayList中的位置 当我从这个ArrayList中删除一个对象时,会出现问题,因为索引会向左移动。避免此问题的最佳方法是什么 我应该不删除元素,而是用null覆盖它们,这样索引就不会移位,还是应该在删除一次之后遍历ArrayList以更新对象中的所有ID字段 //编辑:我的目的:假设我获取该ArrayList的一些对象并将它们插入

我有一个ArrayList和一堆MyObject对象。我想在我的对象中保留一个整数字段,它是ArrayList中这个对象的键,这样我就可以很容易地得到这个元素在ArrayList中的位置

当我从这个ArrayList中删除一个对象时,会出现问题,因为索引会向左移动。避免此问题的最佳方法是什么

我应该不删除元素,而是用null覆盖它们,这样索引就不会移位,还是应该在删除一次之后遍历ArrayList以更新对象中的所有ID字段

//编辑:我的目的:假设我获取该ArrayList的一些对象并将它们插入另一个列表中。稍后在遍历第二个列表时,我想获取第一个ArrayList中对象的键。所以我必须把钥匙保存在物体上。在这种情况下使用地图的好处在哪里?这些键只是自动递增的整数。

您最好使用一个。映射是将关键点映射到值的对象。它不能包含重复的密钥;每个键最多可以映射到一个值

因此,在您的示例中,您可以将id和对象作为键、值对存储在映射中。从那里您可以直接访问相关id的对象。

您最好使用。映射是将关键点映射到值的对象。它不能包含重复的密钥;每个键最多可以映射到一个值


因此,在您的示例中,您可以将id和对象作为键、值对存储在映射中。从那里您可以直接访问相关id的对象。

这可以使用Map-

例如:

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);
每个键在地图上都是唯一的,因此,如果更改值,它不会影响键

在这种情况下,可以存储具有空值的键

否则,如果删除索引并再次放置,将解决以下问题:

        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));
        }

但我想那张地图正是你要找的。第二种方法不是线程安全的,在并发线程的情况下会导致崩溃

例如:

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);
每个键在地图上都是唯一的,因此,如果更改值,它不会影响键

在这种情况下,可以存储具有空值的键

否则,如果删除索引并再次放置,将解决以下问题:

        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));
        }

但我想那张地图正是你要找的。第二种方法不是线程安全的,在并发线程的情况下会导致崩溃

听起来您最好使用map。检查:您可以通过使用普通数组来实现这一点,但我同意,map是一种更好的方法。听起来您最好使用map。检查:您可以通过使用普通数组来实现这一点,但我同意,map是一种更好的方法。map和ArrayList之间的确切区别是什么?我只想使用一个自动递增的整数作为一个键,所以这对它们都有效。我可以通过为它们提供一个键来获得值。那么在我的例子中有什么优势呢?通过id可以比arraylist更容易地访问map。创建映射以存储键、值对数据结构。根据你的问题,这就是你所需要的。如果迭代顺序很重要,你可以使用LinkedHashMap或TreeMap,Map和ArrayList的确切区别是什么?我只想使用一个自动递增的整数作为一个键,所以这对它们都有效。我可以通过为它们提供一个键来获得值。那么在我的例子中有什么优势呢?通过id可以比arraylist更容易地访问map。创建映射以存储键、值对数据结构。根据你的问题,这就是你需要的。如果迭代顺序很重要,你可以使用LinkedHashMap或TreeMapOk,我提出另一个解决方案。。。这就是你想要的吗?你不需要删除它,然后再添加它。只需使用list.setindex,null来覆盖旧元素。不过,地图似乎是最好的解决方案,谢谢!好的,我提出另一个解决方案。。。这就是你想要的吗?你不需要删除它,然后再添加它。只需使用list.setindex,null来覆盖旧元素。不过,地图似乎是最好的解决方案,谢谢!