gpt4 book ai didi

java - ArrayList 返回索引的附加值

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:16:31 24 4
gpt4 key购买 nike

我正在寻找一个类似于 ArrayList 的 java 数据结构,当我只使用一个值参数进行添加或推送时,会自动为我返回一个索引。

例如:

ArrayList<String> elements = new ArrayList<String>();

String element = "foo";
String elementTwo = "bar";

int index1 = elements.add(element); //note this does not exist, i.e. returns bool in api
int index2 = elements.add(elementTwo);

System.out.println(elements.get(index1)); //would give "foo"

我可以看到围绕 ArrayList 编写一个包装类,它管理一个在每次添加操作和调用时递增的计数器:

ArrayList.add(int index, E element)

你真的需要为此写一个 ArrayList 的包装器吗?这似乎很简单,可以开箱即用?

编辑:

对于这个用例,我需要固定且唯一的索引(键)。有人建议使用 map ,我同意。有谁知道在值插入上为您提供自动(唯一)生成的键的映射实现?我只是想决定是否需要为此实现我自己的包装器。

最佳答案

该元素将被添加到列表的末尾。所以你可以使用 elements.size()-1 来获取新的元素索引。

请注意,如果多个线程同时修改列表,这将无法可靠地工作。

编辑:另请注意,使用 ArrayList 的索引作为唯一 ID 可能不是一个好主意,因为元素索引可能会更改(例如,当您使用 add(int, Object) 删除一个元素或插入一个新元素。如果这是一个问题取决于你想用索引做什么:如果你只是在添加一个元素后短时间内需要它并且可以确定列表在此期间没有被修改,那就没有问题。在另一种情况下,即使是在调用 add(Object) 时返回索引的方法也无济于事,因为无论如何索引都不会更新。为防止出现此问题,您可以:

  • 确保您永远不会从列表中删除元素,也永远不会使用 add(int, Object) 添加元素。
  • 除了删除元素,您还可以使用 set(int, null) 方法将它们设置为 null。这样元素索引就不会改变。
  • 使用其他一些数据结构,例如 helloannalil 在他的回答中建议的带有自定义 ID 的 map 。

编辑 2: 我没有找到合适的、随时可用的实现(当然,这并不意味着没有)。要提出一个好的解决方案,需要更多关于数据结构预期用途的信息,但这里有一些想法和注意事项:

  • 如果最大元素数不是很大,可以使用ArrayList,元素索引代表ID。如上所述,要删除一个元素,可以将其设置为 null,这样就不会更改任何索引。插入时,null 值的位置可以重复使用。
  • 您还可以使用此答案中显示的两种方法之一:https://stackoverflow.com/a/8939049/1347968 (关键字 AtomicLongIdentityHashMap)
  • 不要依赖Object.hashCode()System.identityHashCode(Object) 的“唯一性”,因为无法保证(通过运行 Suns/Oracles Bug #6321873 底部的示例来尝试)。

关于java - ArrayList 返回索引的附加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10309026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com