我有一个有序的地图,我看起来需要找到一些关键字,最近的'之前'和'之后'条目完全满足某些条件。
Entry findAfter(TreeMap map, Key key, Predicate p) {
Entry e = map.higherEntry(key);
while (e!=null && !p.test(e.getValue())
e = map.higherEntry(e.getKey());
return e;
}
这似乎效率低,因为O(logN)中的higherEntry。还有更好的方法吗?
我希望TreeMap有map.nextEntry(e)可以在O(1)中工作,但据我所知,没有。
答案 0 :(得分:1)
选中此项:map.tailMap(key)
为您提供SortedSet
map
视图,其中包含大于或等于key
的所有密钥。 map.tailMap(key).entrySet()
会Set<Map.Entry>
为map
中key
项中的Iterator
项,其密钥大于或等于Set
。根据{{3}},Entry findAfter(TreeMap map, Key key, Predicate p) {
for (Entry e : map.tailMap().entrySet()) {
if (p.test(e.getValue() &&
!e.getKey().equals(key))
return e;
}
return null;
}
超过 long now = System.currentTimeMillis();
Uri.Builder eventsUriBuilder = CalendarContract.Instances.CONTENT_URI.buildUpon();
ContentUris.appendId(eventsUriBuilder, Long.MIN_VALUE);
ContentUris.appendId(eventsUriBuilder, Long.MAX_VALUE);
String[] projection = new String[]{CalendarContract.Instances.CALENDAR_ID, CalendarContract.Instances.TITLE,
CalendarContract.Instances.DESCRIPTION, CalendarContract.Instances.BEGIN,
CalendarContract.Instances.END, CalendarContract.Instances.EVENT_LOCATION,
CalendarContract.Instances.EVENT_ID};
Uri eventsUri = eventsUriBuilder.build();
Cursor instance_cursor = getContentResolver().query(
eventsUri, projection, CalendarContract.Instances.BEGIN + " >= " + now + " and " + CalendarContract.Instances.BEGIN
+ " <= " + (now + 2592000000L) + " and " + CalendarContract.Instances.VISIBLE + " = 1",
null, CalendarContract.Instances.DTSTART + " ASC");
以递增键顺序返回条目。
所以这样的事情对你有用:
recyclerview
密钥子集上的迭代器必须更接近 O(1),而不是搜索每个连续更高密钥的所有密钥。