Java迭代器从排序集的特定元素开始

Java迭代器从排序集的特定元素开始,java,performance,collections,iterator,Java,Performance,Collections,Iterator,我有一个Java排序集(如树集)。 我希望有一个从树的特定元素开始的迭代器,并且能够转到下一个或上一个元素(按照排序顺序) 有没有办法在不实现自己的数据结构的情况下做到这一点 谢谢 编辑: 我忘了提到我想用一种天真的方式(如果有的话)来做这件事,因为我关心性能。如果我能够访问树的实现,那么需要O(1)个时间来完成。我想要类似的东西 您也可以随意推荐支持此功能的java排序树的其他(第三方)实现。您可以继续调用continue以跳过该迭代,直到找到要查找的对象为止。如果没有更多的上下文,很难提供

我有一个Java排序集(如树集)。 我希望有一个从树的特定元素开始的迭代器,并且能够转到下一个或上一个元素(按照排序顺序)

有没有办法在不实现自己的数据结构的情况下做到这一点

谢谢


编辑:

我忘了提到我想用一种天真的方式(如果有的话)来做这件事,因为我关心性能。如果我能够访问树的实现,那么需要O(1)个时间来完成。我想要类似的东西


您也可以随意推荐支持此功能的java排序树的其他(第三方)实现。

您可以继续调用continue以跳过该迭代,直到找到要查找的对象为止。如果没有更多的上下文,很难提供更多的信息

ArrayList list = new ArrayList();
Iterator itr = list.iterator();
boolean skipElement = true;
while(itr.hasNext()) {
    Object element = itr.next();
    if(element.equals(myTargetElement)){ //target element is what you're comparing against to see where you want to start iterating (you didn't supply that info so not sure how you want to handle this)
        skipElement=false;
    }
    if(skipElement){
        continue;
    }
     System.out.print(element);
  }

这将打印出首先要开始迭代的元素。

树集返回的迭代器不支持向前和向后。因此,如果向前和向后是一个困难的要求,那么您必须首先创建一个列表并从中获取列表迭代器:

List<T> list = new ArrayList<>(treeSet);
int index = list.indexOf(object);
ListIterator<T> iterator = list.listIterator(index);
这相当快,因为
tailSet
返回给定子集的视图,因此它不需要复制集合的一部分。

TreeSet set=new TreeSet(IntStream.range(0,10).boxed().collect(Collectors.toList());
  TreeSet<Integer> set = new TreeSet<>(IntStream.range(0, 10).boxed().collect(Collectors.toList()));
  for (int n : set.stream().skip(5).collect(Collectors.toList())) {
     System.out.println(n);
  }
对于(int n:set.stream().skip(5.collect)(Collectors.toList())){ 系统输出println(n); }
要从
SortedSet s
的元素
x
前进,请使用
s.tailSet(x).iterator()

要从
NavigableSet s
的元素
x
返回,请使用
s.degeningset().tailSet(x.iterator()

tailSet()。因此,它们的实现无法创建原始集的副本(否则,如果查看的集发生更改,副本将过期),因此将具有O(1)性能


TreeSet
是一个
NavigableSet
,因此是一个
SortedSet

您可以尝试以下方法:

List<Long> list = Arrays.asList(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 0L);
TreeSet<Long> tree = new TreeSet<>(list);
tree.tailSet(4L).iterator()
List List=Arrays.asList(1L、2L、3L、4L、5L、6L、7L、8L、9L、0L);
树集树=新树集(列表);
tree.tailSet(4L.iterator())

不清楚:给定一个集合{12,42,56},为了得到{42,56},你想说“给我从42开始的数据”还是“给我从第二个元素开始的数据”?我想得到一个从特定元素开始的迭代器,比如说42(这将被给出),然后使用next()/previous()之类的方法根据Thanx的答案转到56/12,但这不是很有效
List<Long> list = Arrays.asList(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 0L);
TreeSet<Long> tree = new TreeSet<>(list);
tree.tailSet(4L).iterator()