我有一个需要按插入顺序遍历的列表。但是,我想通过在值上使用floorEntry和ceilingEntry来找到“起点”。
所以我需要一个具有以下所需操作的集合:
因此集合需要按插入顺序排序,但也需要根据排序值进行随机访问。
是否有像LinkedSortedMap这样的东西?但不确定这是否会奏效。
如何在链表中找到值的第一个floorEntry()? 如何找到所有floorEntries形成一个链表?
==============换句话说==============================
//I have timeseries of Ints.
TimeSeries<Int> collection = new LinkedList<>()
/*
FindAndRemove is to remove first n Ints that are <= x
*/
FindAndRemove1(Int x,int n) {
//return an iter to filtered subset of collection
iter = collection.floorEntrySet(x)
for (int i =0; i<n; i++) {
iter.remove()
if (!iter.hasnext) break;
iter->next
}
FindAndRemove2(Int x,int n) {
//return an collection.iter to oldest Int that is <= x
iter = collection.floorEntry(x)
for ( int i = 0; iter.hasnext; iter.next ) {
if ( iter.x > x )
continue;
iter.remove()
if ( ++i > n ) break;
}
}
答案 0 :(得分:0)
如果您希望能够支持删除,那么您可以使用TreeMap,其中键是自动递增的整数
TreeMap<Integer, Object> sortedMap;
HashMap<Object, Integer> lookupMap;
int key;
public void add(Object obj) {
sortedMap.put(key, obj);
lookupMap.put(obj, key);
key++;
}
使用查找映射在已排序的映射中查找对象的键,然后使用检索到的键对已排序的映射执行楼层/天花板查询。
Google有一个HashBiMap,您可以通过在一个方向使用哈希地图并在另一个方向使用树形图来适应您的需求