Java 从特定位置(关键点)向后高效地迭代/子映射树映射

Java 从特定位置(关键点)向后高效地迭代/子映射树映射,java,Java,我需要的是一个子列表的值从一个请求的键向后n个条目。因为地图真的很大,我想知道“地板客”是否是完成这项任务最有效的方法 这个代码能写得更快吗 TreeMap qMap = new TreeMap(); Object key = "startKey"; for (int i=0; i<2000; i++) { key = qMap.floorKey(key); } // get a c

我需要的是一个子列表的值从一个请求的键向后n个条目。因为地图真的很大,我想知道“地板客”是否是完成这项任务最有效的方法

这个代码能写得更快吗

        TreeMap qMap = new TreeMap();
        Object key = "startKey";

        for (int i=0; i<2000; i++) {
            key = qMap.floorKey(key);
        }

        // get a collection holding last 2000 history objects at startkey
        Collection neededValues = qMap.subMap(key, "startKey").values(); 
您可以从
树形图
中获取一个

有点像(没有尝试)

NavigableSet keys=qMap.navigableKeySet().headSet(“开始键”);
迭代器goBack=keys.DegendingIterator();

不确定这是否会对性能产生很大影响。至少它似乎摆脱了你对floorKey的2000次呼叫。

请不要因为你必须转换按键集
NavigableSet keys=(NavigableSet)a.navigableKeySet().headSet(“startKey”)
和耳机本身不包含请求的密钥,您必须手动添加它们(这没有问题,因为您必须请求它们)。您是否发现这是否比原始方法更有效?
public static void main(String[] args) {
        TreeMap a = new TreeMap();
        for (int i=0; i<5000000; i++) a.put("a"+i, i);

        int i=2000;
        Object dummy;

        System.out.println("start a");
        long start = new Date().getTime();
        NavigableSet keys = (NavigableSet) a.navigableKeySet().headSet("a"+670812); // some random position
        Iterator goBack = keys.descendingIterator();

        while (goBack.hasNext() && i>0) {
            dummy = goBack.next();
            i--;
        }

        System.out.println("run a " + (new Date().getTime() - start));
        System.out.println("start b");

        start = new Date().getTime();
        Object key = "a"+670812;
        for (i=0; i<2000; i++) {
            key = a.floorKey(key);
        }

        Object dummy2 = a.subMap(key, "a" + 670812).values();
        System.out.println("run b " + (new Date().getTime() - start));
    }
start a
run a 6
start b
run b 7
NavigableSet<T> keys = qMap.navigableKeySet().headSet("startKey");
Iterator<T> goBack = keys.descendingIterator();