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编写一个包装器吗?这似乎很简单,可以在某个地方开箱即用?
编辑:
我需要为此用例修复和唯一索引(键).提出了一张地图,我同意这一点.有没有人知道一个地图实现,它会在值插入上为您提供自动(唯一)生成的键?我只是想确定是否需要为此实现自己的包装器.
该元素将添加在列表的末尾.因此,您可以使用elements.size()-1获取新元素索引.
请注意,如果多个线程同时修改列表,这将无法正常工作.
编辑:另请注意,使用ArrayLists索引作为唯一ID 可能不是一个好主意,因为元素索引可以更改(例如,当您删除元素或插入新元素时add(int, Object)).如果这是一个问题,取决于你想要对索引做什么:如果你只需要在添加元素后短时间内需要它,并且可以确保在此期间不修改列表,则没有问题.在另一种情况下,即使是在调用时返回索引的方法add(Object)也无济于事,因为无论如何索引都没有得到更新.要防止此问题,您可以:
add(int, Object).null使用该方法,而不是删除元素set(int, null).这样,没有元素索引会改变.编辑2:我没有找到适当的,准备好使用的实现(但这并不意味着没有,当然).为了提出一个好的解决方案,需要有关数据结构预期用途的更多信息,但这里有一些想法和注意事项:
ArrayList可以使用an ,元素index表示ID.如上所述,要删除元素,可以将其设置为null不更改索引.插入时,null可以重复使用带有值的位置.AtomicLongor IdentityHashMap)Object.hashCode()或System.identityHashCode(Object)因为它不能保证(通过在底部运行示例尝试太阳/ Oracle的错误#6321873).