哪个集合将满足下面的测试程序:地图与位置索引
public class TestOrderedList {
// The class I'm looking for:
MapWithIndex<String,Person> ol = new MapWithIndex<String, Person>();
// class Person left out for brevity
public TestOrderedList() {
Person benny = new Person("Benny");
Person charles = new Person("Charles");
Person alvin = new Person("Alvin");
Person calvin = new Person("Calvin");
ol.put("Benny", benny); // should return 0
ol.put("Charles", charles); // should return 1
ol.put("Alvin", alvin); // should return 0
ol.put("Calvin", calvin); // should return 2
int index = ol.findIndex("Benny"); // should return 1
Person adam = new Person("Adam");
ol.put("Adam", adam); // should return 0 (new pos)
index = ol.findIndex("Benny"); // should return 2
ol.remove("Alvin"); // should return 1 (existing pos)
index = ol.findIndex("Benny"); // should return 1
}
}
集合不必是实现任何特定的接口,或可转换为另一个集合(然而这是可能这将是尼斯)。
它不必是线程安全的,但如果是....好!
返回-1找不到或错误的情况是OK的时候。
收集的目的是,我很快就需要知道在哪个位置一个新插入的记录放入。此外,我想在一个记录存在什么位置查找。
收集并不需要支持重复键。
---更新----
我去ArrayList的解决方案,其中我把它插入之前做一个二进制查找排序(得到它应插入索引)。这样,列表中的位置总是对应于行号(在与该列表同步的表中)。它快速简单。我确定必须存在比我更强大的实现,尽管?!?!
该结构非常奇怪,因为它返回插入元素的“位置”,但该位置不固定。像这样的结构永远不会是线程安全的。可能你需要解释你在做什么。 – gfelisberto 2014-10-27 23:24:57
好的,我可以补充说,在这种情况下,它不必是线程安全的。但是“put”方法应该返回该记录插入的位置。 – 2014-10-27 23:27:14
可能是一个可索引的SkipList适合账单。虽然ConcurrentSkipListMap可能会关闭,但JDK中没有一个。 http://en.wikipedia.org/wiki/Skip_list#Indexable_skiplist – spudone 2014-10-27 23:32:11