我有一个TreeMap<Date, Integer>
,我想从该地图中获取第 n 个项目。我现在想到的是:
((Integer)myTreeMap.values().toArray()[index]).intValue();
但这感觉很笨拙,更不用说堆上正在发生的或性能如何了?
是否有一种简便的方法从TreeMap
/ SortedMap
中获得第 n 个项目?
答案 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]