Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从树状图中获取第n项?_Java_Treemap_Sortedmap - Fatal编程技术网

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]