Java 如何从树状图中获取第n项?
我有一个Java 如何从树状图中获取第n项?,java,treemap,sortedmap,Java,Treemap,Sortedmap,我有一个TreeMap,我想从该映射中获取第n项。我现在想到的是: ((Integer)myTreeMap.values().toArray()[index]).intValue(); 但这感觉相当笨拙,更不用说堆上或性能上发生了什么 有没有一种简洁的方法可以从树映射/分类映射中获取第n项?我们可以在这里尝试使用流。在下面的代码片段中,我们创建了一个包含五个条目的排序映射。然后,我们创建一个流,跳过前3个元素,并使用findFirst捕获第一个元素 Map<Integer, String
TreeMap
,我想从该映射中获取第n项。我现在想到的是:
((Integer)myTreeMap.values().toArray()[index]).intValue();
但这感觉相当笨拙,更不用说堆上或性能上发生了什么
有没有一种简洁的方法可以从
树映射
/分类映射
中获取第n项?我们可以在这里尝试使用流。在下面的代码片段中,我们创建了一个包含五个条目的排序映射。然后,我们创建一个流,跳过前3个元素,并使用findFirst
捕获第一个元素
Map<Integer, String> myTreeMap = new TreeMap<>();
myTreeMap.put(1, "one");
myTreeMap.put(2, "two");
myTreeMap.put(3, "three");
myTreeMap.put(4, "four");
myTreeMap.put(5, "five");
String fourth = myTreeMap.entrySet().stream()
.skip(3)
.map(map -> map.getValue()).findFirst().get();
System.out.println("fourth value in map is: " + fourth);
Map myTreeMap=newtreemap();
myTreeMap.put(1,“一”);
myTreeMap.put(2,“2”);
myTreeMap.put(3,“三”);
myTreeMap.put(4,“四”);
myTreeMap.put(5,“五”);
String fourth=myTreeMap.entrySet().stream()
.跳过(3)
.map(map->map.getValue()).findFirst().get();
System.out.println(“地图中的第四个值是:“+fourth”);
编辑:另一种选择是
final Optional<T> first =
treeMap.values()
.stream()
.skip(index - 1)
.findFirst();
if (first.isPresent()) {
final T value = first.get();
}
您可以使用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());
为什么不在treemap值上使用流,跳过n-1个元素并获取其余元素中的第一个?除非您有自定义实现,否则迭代是知道哪个叶节点是“n”的唯一方法。默认treemap实现不支持这一点。它使用内部java.util.TreeMap.Values
类型来保留不支持基于索引的访问的值。对于键集也是如此。它们确实可以很容易地获取高于/低于阈值的键的值,也许您可以尝试使用该值而不是第n个值?如果贴图很大,这是非常低效的。。。实例化所有值的完整列表只是为了得到一个可能非常接近“head”的值。@Renato同样对流版本有效,我认为使用Collect.toList。一点也不。流版本不需要收集整个集合(它甚至不需要收集,这个答案需要改进)。@Renato是的,但是跳过后必须使用findFirst。使用Collectors.toList您需要完整的列表。当您可以使用值并且只需要它们时,为什么要在入口集上进行流式处理?只需执行treeMap.values().stream().skip(5).findFirst().orElse(-1)
@mayamar映射可能在内部将其数据维护为Entry
s;调用values()
将迫使它首先完全解析这些值以创建该集合。所以这取决于实现,但效率更高的可能性更大。@daniu不,我检查过,两个调用“getFirstEntry()”,并且都从那里开始使用迭代器
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;
}
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]