ArrayList,返回索引,添加值

Rya*_* R. 9 java collections data-structures

我正在寻找一个类似于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"
Run Code Online (Sandbox Code Playgroud)

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

ArrayList.add(int index, E element)
Run Code Online (Sandbox Code Playgroud)

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

编辑:

我需要为此用例修复和唯一索引(键).提出了一张地图,我同意这一点.有没有人知道一个地图实现,它会在值插入上为您提供自动(唯一)生成的键?我只是想确定是否需要为此实现自己的包装器.

sie*_*egi 5

该元素将添加在列表的末尾.因此,您可以使用elements.size()-1获取新元素索引.

请注意,如果多个线程同时修改列表,这将无法正常工作.

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

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

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

  • 如果元素的最大数量不是很大,则ArrayList可以使用an ,元素index表示ID.如上所述,要删除元素,可以将其设置为null不更改索引.插入时,null可以重复使用带有值的位置.
  • 您还可以使用此答案中显示的两种方法之一:https://stackoverflow.com/a/8939049/1347968(keywords AtomicLongor IdentityHashMap)
  • 不要依赖于的"独特性" Object.hashCode()System.identityHashCode(Object)因为它不能保证(通过在底部运行示例尝试太阳/ Oracle的错误#6321873).