如何在TreeMap中获取上一个和下一个条目

时间:2017-09-18 02:41:22

标签: java treemap sortedmap

我有一个有序的地图,我看起来需要找到一些关键字,最近的'之前'和'之后'条目完全满足某些条件。

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)中工作,但据我所知,没有。

1 个答案:

答案 0 :(得分:1)

选中此项:map.tailMap(key)为您提供SortedSet map视图,其中包含大于或等于key的所有密钥。 map.tailMap(key).entrySet()Set<Map.Entry>mapkey项中的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),而不是搜索每个连续更高密钥的所有密钥。