首页 > 解决方案 > SortedSet.subset 返回大小 == 0 子集

问题描述

放轻松,这是我第一次在这个级别上与 Comparator 一起工作。

@SuppressWarnings({ "rawtypes", "unchecked" })
public T getObjectFromExample(T object)
    {
        if (!sorted)
            throw new IllegalStateException();
        SortedSet<T> subset = setReference.subSet(object,object);
        if (subset.size() == 0)
        {
            clsMainProgram.DebugMessage("Returned null for "+object.getClass().getName());
            return null;
        }
        return subset.first();
    }

...是我在这样声明的 TreeSet 上使用的方法调用。

setReference =  Collections.synchronizedSortedSet(new TreeSet<T>(comparator));

这是比较器

public class clsComparator implements Serializable, Comparator<infIDClass> {
    private static final long serialVersionUID = -4212404170394031421L;
    @Override
    public int compare(infIDClass o1, infIDClass o2) {
        // TODO Auto-generated method stub
                int z1 = (int)o1.GetID();
                int z2 = (int)o2.GetID();;
                if(z1 > z2)
                    return 1;
                return z2 <= z1 ? 0 : -1;
    }
}

infIDClass 就是这样:

public interface infIDClass {
    public int GetID();
    public int SetID(int newID);
}

我传递来获取另一个具有相同 ID 的对象的对象是这样构造的:

//USED ONLY FOR COMPARISONS
private Building(int bID) {
    this.ID = bID;
}

被传递的对象只是一个带有 int ID 的空白模板,比较器将不同项目比较到集合中的方式只是将 ID 整数从低到高排序。这背后的想法是快速有效地从 set Reference 中获取具有 ID 的对象,而无需遍历整个事物。

出于某种原因,每当我运行 GetObjectFromExample 时,它​​有一半的时间返回一个空值,而当使用 tailSet 和 headSet 时,它似乎做同样的事情。我不完全确定它为什么这样做,代码似乎对我来说是正确的。

我不知道它为什么会这样做,除了在将它发送到比较器时进行某种模板转换,但我不确定。

标签: javasortingset

解决方案


我认为问题就在这里SortedSet<T> subset = setReference.subSet(object,object);

根据API subSet为您提供第一个参数(包括)到第二个参数(不包括)之间的元素。所以这个调用setReference.subSet(object,object)总是返回空集


推荐阅读