java - 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 时,它似乎做同样的事情。我不完全确定它为什么这样做,代码似乎对我来说是正确的。
我不知道它为什么会这样做,除了在将它发送到比较器时进行某种模板转换,但我不确定。
解决方案
我认为问题就在这里SortedSet<T> subset = setReference.subSet(object,object);
根据API subSet
为您提供第一个参数(包括)到第二个参数(不包括)之间的元素。所以这个调用setReference.subSet(object,object)
总是返回空集
推荐阅读
- c# - 使用 ISyntaxReceiver 获取所有成员,甚至从 ClassDeclarationSyntax 继承一个
- python - 如何根据列表中相同的设置值对列表列表进行排序?
- java - 寻找最好的方法来做一个 nato phoetic 字母转换器
- sql - 将多行转换为具有更多列的单行
- julia - 如何获取给定时区的时区偏移量
- python - `_create_slots(self, var_list)` 只是未来扩展的占位符吗?
- wso2 - WSO2 Identity Server CAS 是否支持续订选项?
- reactjs - 在 rc-yearly-calendar 上反应引导工具提示
- node.js - 使用上下文 Api 对用户进行身份验证
- javascript - 客户端验证然后传递到服务器或禁用提交直到表单完成 - 我该怎么做?