如何从TreeMap获取第n个项目?

时间:2019-03-23 15:57:02

标签: java treemap sortedmap

我有一个TreeMap<Date, Integer>,我想从该地图中获取第 n 个项目。我现在想到的是:

((Integer)myTreeMap.values().toArray()[index]).intValue();

但这感觉很笨拙,更不用说堆上正在发生的或性能如何了?

是否有一种简便的方法从TreeMap / SortedMap中获得第 n 个项目?

3 个答案:

答案 0 :(得分:1)

我们可以在此处尝试使用流。在下面的代码段中,我们创建了一个包含五个条目的排序地图。然后,我们创建一个流,跳过前三个元素,并使用<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script> <div class="page"> <div class="container"> <h3>Container</h3> </div> <ul class="hs"> <li class="item">test</li> <li class="item">test</li> <li class="item">test</li> <li class="item">test</li> <li class="item">test</li> <li class="item">test</li> <li class="item">test</li> <li class="item">test</li> </ul> <div class="container"> <div class="row"> <div class="scrollbar"> <div class="handle"></div> </div> </div> </div> </div>捕获第一个元素。

findFirst

答案 1 :(得分:1)

编辑:另一种选择是

final Optional<T> first =
        treeMap.values()
               .stream()
               .skip(index - 1)
               .findFirst();

if (first.isPresent()) {
    final T value = first.get();
}

final List<T> values = new ArrayList<>(myTreeMap.values());
final T value = values.get(index);

T只是一种通用类型,代替了Map值类型。
index是您的 nth 元素。

正如所指出的那样,这对于大型地图而言效率低下,因为内部ArrayList方法的toArray方法被称为

public Object[] toArray() {
    // Estimate size of array; be prepared to see more or fewer elements
    Object[] r = new Object[size()];
    Iterator<E> it = iterator();
    for (int i = 0; i < r.length; i++) {
        if (! it.hasNext()) // fewer elements than expected
            return Arrays.copyOf(r, i);
        r[i] = it.next();
    }
    return it.hasNext() ? finishToArray(r, it) : r;
}

答案 2 :(得分:0)

您可以使用Steam并跳过n-1个元素,并采用第一个元素,如下所示: tmap.entrySet().stream().skip(n-1).findFirst();。数据集示例的详细信息:

TreeMap<Date, Integer> tmap = new TreeMap<Date, Integer>();
tmap.put(new Date(2014, 1, 1), 0);
tmap.put(new Date(2015, 1, 1), 1);
tmap.put(new Date(2016, 1, 1), 2);
tmap.put(new Date(2017, 1, 1), 3);
tmap.put(new Date(2018, 1,1 ), 4);

System.out.println(tmap);

// Let's find the nth elements i.e n = 3;
int n = 3;
System.out.println(" " + n + " elements: ");
System.out.println(tmap.entrySet().stream().skip(n-1).findFirst());

输出如下:

{Sun Feb 01 00:00:00 IST 3914=0, Mon Feb 01 00:00:00 IST 3915=1, Tue Feb 01 00:00:00 IST 3916=2, Thu Feb 01 00:00:00 IST 3917=3, Fri Feb 01 00:00:00 IST 3918=4}
3 elements: 
Optional[Tue Feb 01 00:00:00 IST 3916=2]