Java 为什么下降集比原始集小?

Java 为什么下降集比原始集小?,java,collections,set,Java,Collections,Set,我收集了191种元素: NavigableSet<Taxon> _set = new ConcurentSkipListSet<>(); ... _set.size(); // 191 _set.descendingSet().size(); // also 191 _set.descendingSet().toArray().length; // 53 _set.toArray().length; // 191 Taxon.java: class Taxon impl

我收集了191种元素:

NavigableSet<Taxon> _set = new ConcurentSkipListSet<>();
...
_set.size(); // 191
_set.descendingSet().size(); // also 191
_set.descendingSet().toArray().length; // 53
_set.toArray().length; // 191
Taxon.java:

class Taxon implements Comparable<Taxon> {

    public final int x;
    public final int y;
    public final int r;
    public final List<Long> ips;

    public Taxon(int x, int y, int r, List<Long> ips) {
        this.x = x;
        this.y = y;
        this.r = r;
        this.ips = ips;
    }

    @Override
    public int compareTo(Taxon o) {
        return this.ips.size() > o.ips.size() ? 1 : -1;
    }

}
为什么选择下降集阵列更小?当我迭代_sel.degendingset时,它在53元素上断开。如何迭代整个降序集合

更新
我确信在检查过程中没有对该集合进行任何修改

此问题是由于compareTo方法的错误实现造成的。 与合同相比,此处不遵循合同

合同规定,如果x.comparedToy==-y.comparedTox。让我们考虑下面的例子 假设类分类单元有以下对象,其插入顺序如下所述

insertion order for Taxon   ips List size 
taxon0                      3
taxon1                      1
taxon2                      1
taxon3                      3
taxon4                      1
taxon0.comparedTotaxom3为-1,taxon3.ComparedToxO0也为-1。表示taxon0小于taxom3,taxom3小于taxom0,这是错误的

_set.degendingset.size和_set.degendingset.toArray.length返回不同的结果,因为_set.degendingset.toArray方法在内部使用迭代器获取集合的当前快照。迭代器在内部使用compareTo方法对集合进行迭代。size方法不使用迭代器,只计算元素的数量,因此两者的返回值不同

ConcurrentSkipListSet按元素的自然顺序或基于比较器排列其元素。当我们将taxom对象添加到ConcurrentSkipListSet中时,它们按以下顺序排列,跳过此处的索引节点

税目->税种4->税种2->税种1->税种3->税种0->空

_位于taxon0的set.downingSet.toArray.length集合指针,在该taxon0之后,taxon0.comparedTotaxon3返回-1。 所以迭代器决定taxom0在taxom3之前,并且在迭代期间跳过taxom3。迭代器知道了这一点 taxom1先于taxom0。在指针移动到taxom1之后,由于跳过列表算法,将wise taxon1与taxom4而非taxom2进行比较,下指针和右指针以及taxom1。comparedTotaxom4表示taxom1小于taxom4,这与实际排列相矛盾,指针移动到头部。因此迭代器只返回两个元素

这里我们有两种长度的ips列表1,3。因此,只有两个要素。在您的示例中,您可能有91种不同长度的IP列表。由于compareTo方法,跳过所有重复项


您可以在compareTo方法中添加更多属性,以根据业务逻辑决定分类单元的自然顺序

下面是迭代整个降序集合的答案。 将其转换为列表,现在您可以轻松地对其进行迭代…:

 List<Taxon> taxonList = new ArrayList<Taxon>(_set);
 System.out.println(taxonList.size());
 int size = taxonList.size();
 for(int i = size-1; i<=0; i--)
  {
     System.out.println(taxonList.get(i));
  }

我不认为这是你真正的代码。此外,由于您有一个ConcurrentSkipListSet,它可能会被另一个在_set.degendingset.size;和_set.downingset.toArray.length;这将是一个有效的结果。你能和升序排列相比较吗。听起来你的收藏已经损坏了。可能您的compareTo在某种程度上被破坏了。希望您可能是这样,或者您的代码可能正在更改实际的集合,\u集合位于集合大小和集合数组大小的计算之间。。请查收。您是否有自己的比较器转换为降序集?张贴自定义比较器的代码。问题在于有些值在应该不同的时候被认为是相等的。你的比较器没有相等的理由。