2015-11-03 127 views
3

我有一个TreeSet并遍历它。在迭代时,我必须将每个元素与此TreeSet中的其余条目进行比较。迭代器中的迭代器在树型集合中的迭代器

问题是我不能有一个迭代器开始在一个特定的点。

TreeSet<Object> tree = new TreeSet<>(); 

Iterator<Object> i1= tree.iterator(); 
while (i1.hasNext()) { 
    element1 = i1.next(); 

    ListIterator<String> i2 = // start at the point from 'i1' 
    while (i2.hasNext()) { 
     element2 = i2.next(); 
     System.out.println("Interact: " + element1 + " " + element2 ); 
    } 

} 

我需要TreeSet,因为它的插入和排序速度非常适合我的工作。我确实需要一个解决方案,而不需要使用Libary。

你会如何解决这个问题?

+0

被简化,不要使用迭代器,具有增强的for循环或两个基础上,TreeSet的大小循环尝试。尽管复杂性会受到打击。 你也可以尝试转换set toArray()并使用该数组。 –

+0

我想使用除迭代器以外的其他东西。 TreeSet包含大约10^5个条目,但填充时不会更改。我会尝试转换它,没有想过它。 { 的(对象号码:tree.tailSet(邻,真)){ }} : – arcs

回答

4

您可以使用tailSet(E fromElement, boolean inclusive)从所需元素开始获取子集,然后在该子集上进行迭代。

Iterator<Object> i1= tree.iterator(); 
while (i1.hasNext()) { 
    element1 = i1.next(); 

    Iterator<Object> i2 = tree.tailSet(element1,true).iterator(); 
    while (i2.hasNext()) { 
     element2 = i2.next(); 
     System.out.println("Interact: " + element1 + " " + element2 ); 
    } 

} 

正如OldCurmudgeon提到可以用

for (Object element1 : tree) { 
    for (Object element2 : tree.tailSet(o, true)) { 
     System.out.println("Interact: " + element1 + " " + element2 ); 
    } 
} 
+4

可以用'的(树对象O),可以大大简化' – OldCurmudgeon

+0

请问TreeSet的或其他的这个副本部分提出如何这个操作很贵吗? TreeSet包含大约10^5的条目,我必须做很多。 – arcs

+1

@ Omix22根据Javadoc的说法,'tailSet''返回这个集合的元素大于(或等于,如果包含为真)fromElement的部分的视图。返回的集合由此集合支持。这意味着它不会创建原始Set的副本。 – Eran