Java 为什么下降集比原始集小?
我收集了191种元素: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
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集合位于集合大小和集合数组大小的计算之间。。请查收。您是否有自己的比较器转换为降序集?张贴自定义比较器的代码。问题在于有些值在应该不同的时候被认为是相等的。你的比较器没有相等的理由。