Java 迭代器的树集定义与接口迭代器不一致?
我正在使用一些遗留代码,它使用Java 迭代器的树集定义与接口迭代器不一致?,java,collections,iterator,treeset,Java,Collections,Iterator,Treeset,我正在使用一些遗留代码,它使用TreeSet来执行对象集合的排序。(使用TreeSet的替代方案是一个很好的参考,但我并不想特别改变这一点 该类有两个方法iterator() 迭代器() 按升序返回此集合中元素的迭代器 和下降迭代器() 下降迭代器() 按降序返回此集合中元素的迭代器 我对由集合实现的迭代器接口或在自己的实现中实现的接口的概念是,您不能假定任何特定的顺序 在已经提供的实现中,假设这两个调用以正确的顺序给出迭代器。目前的结果是好的,我担心这是一个错误的假设,因为它违反了迭代器接口原
TreeSet
来执行对象集合的排序。(使用TreeSet的替代方案是一个很好的参考,但我并不想特别改变这一点
该类有两个方法iterator()
迭代器()
按升序返回此集合中元素的迭代器
和下降迭代器()
下降迭代器()
按降序返回此集合中元素的迭代器
我对由集合实现的迭代器
接口或在自己的实现中实现的接口的概念是,您不能假定任何特定的顺序
在已经提供的实现中,假设这两个调用以正确的顺序给出迭代器。目前的结果是好的,我担心这是一个错误的假设,因为它违反了迭代器
接口原则,将来可能会改变
我没有使用TreeSet
的经验,也没有看到按顺序轮询元素的遍历方法。有没有办法做到这一点,或者只是坚持使用迭代器,希望一切顺利
编辑
{//block 1
Iterator<BeatDesc> itBeatDesc = beatsOrderedTS.descendingIterator();
}
{//block 2
for (BeatDesc beatDesc : itBeatDesc){
....
}
用法示例:
TreeSet<BeatDesc> beatsOrderedTS = new TreeSet<>(new Comparator<BeatDesc>() {
@Override
public int compare(BeatDesc lhs, BeatDesc rhs) {
return lhs.getTS() - rhs.getTS() < 0 ? -1 : 1;
}
});
BeatDesc latest = beatsOrderedTS.descendingIterator().next()
TreeSet beatsOrderedTS=新树集(新比较器(){
@凌驾
公共整数比较(BeatDesc lhs、BeatDesc rhs){
返回lhs.getTS()-rhs.getTS()<0?-1:1;
}
});
BeatDesc latest=beatsOrderedTS.DegensingIterator().next()
编辑
{//block 1
Iterator<BeatDesc> itBeatDesc = beatsOrderedTS.descendingIterator();
}
{//block 2
for (BeatDesc beatDesc : itBeatDesc){
....
}
{//block 1
迭代器itBeatDesc=beatsOrderedTS.DegendingIterator();
}
{//第2区
for(BeatDesc BeatDesc:itBeatDesc){
....
}
因此,通过使用此格式,您可以在块1和块2之间创建一个绑定旨在按照以下任一方式维护元素的顺序(升序或降序):
- 要插入到集合机具的
可比
中的对象类似于:
class MyObject implements Comparable<MyObject> {..
class MyComparator implements Comparator<MyObject> {..
... new TreeSet<>(new MyComparator());
因此,可以保证您将按照这些接口的实现来按顺序获取元素。旨在按照以下任一方式维护元素的顺序(升序或降序):
- 要插入到集合机具的
可比
中的对象类似于:
class MyObject implements Comparable<MyObject> {..
class MyComparator implements Comparator<MyObject> {..
... new TreeSet<>(new MyComparator());
因此,可以保证,您将根据这些接口的实现按顺序获取元素。我不知道您是从哪里想到的“您不能假定由
集合上的迭代器
它没有说任何关于订购的内容
现在,Collection
方法的javadoc说:
返回此集合中元素的迭代器。不保证返回元素的顺序(,除非此集合是提供保证的某个类的实例)
例如,、和所有实现都保证定义的顺序:
TreeSet
-根据使用的构造函数,使用元素的自然顺序或在设置的创建时间提供的比较器对元素进行排序
LinkedHashSet
-此链表定义迭代顺序,即元素插入集合的顺序(插入顺序)
EnumSet
-迭代器方法返回的迭代器按元素的自然顺序(声明枚举常量的顺序)遍历元素
List
-有序集合(也称为序列)。-iterator()
按正确的顺序返回此列表中元素的迭代器
我不知道你是从哪里想到的“你不能对一个函数返回的元素进行任何特定的排序。javadoc只是说:
集合上的迭代器
它没有说任何关于订购的内容
现在,Collection
方法的javadoc说:
返回此集合中元素的迭代器。不保证返回元素的顺序(,除非此集合是提供保证的某个类的实例)
例如,、和所有实现都保证定义的顺序:
TreeSet
-根据使用的构造函数,使用元素的自然顺序或在设置的创建时间提供的比较器对元素进行排序
LinkedHashSet
-此链表定义迭代顺序,即元素插入集合的顺序(插入顺序)
EnumSet
-迭代器方法返回的迭代器按元素的自然顺序(声明枚举常量的顺序)遍历元素
List
-有序集合(也称为序列)。-iterator()
按正确的顺序返回此列表中元素的迭代器
你不需要抱有希望。TreeSet.iterator()的规范保证它以升序进行迭代。这是真的,并且永远都是真的。TreeSet
是一个排序集(唯一元素)。排序是唯一保证的顺序。您的代码不应假定任何其他内容。您在说“正确的排序”时还谈论了什么排序?为了使TreeSet
成为Collection
,它只需实现Collection
接口中定义的方法。添加额外的fu没有错n可选性。您可能还想查看另一个有序集合LinkedHashMap
。@Radu Ionescu很棒