#pragma strict
public class TEffectComparator implements IComparer
{
public function TEffectComparator()
{
}
public function Compare (f:Object,s:Object)
{
if(f.type>s.type)
return 1;
else if(f.type<s.type)
return -1;
return 1; //Will it cause errors?
}
}
我想实现优先级队列。
我不想实现特殊的ID属性。
如果我的比较函数每次当两个对象相等时返回1,它会导致错误吗?
答案 0 :(得分:2)
可能。
在实现IComparer
(通用或非通用)时签署的隐式契约是您根据约定行事,即不应为相等元素返回1。
Documentation: IComparer.Compare:
小于零意味着x小于y 零表示x等于y 大于零意味着x大于y。
如果您使用的是从x或y中无法获得的知识,那么您将面临不一致的排序风险。
具体来说,.NET中的不同排序实现可能会被优化,如果已经“知道”结果,则不会向comparer对象询问每个比较。
另请注意,比较器应该是自反和对称的,这意味着以下测试应该通过:
compare(x, y) == 0
隐含compare(y, x) == 0
,反之亦然compare(x, y) < 0
表示compare(y, x) > 0
,与compare(x, y) < 0
和compare(y, z) < 0
表示compare(x, z) < 0
您的实施至少失败了。 2,根据您比较的顺序,它将失败nbr。 3。
所以它可能不是错误,因为它会引发异常。它可能,但它可能不会。但是,它可能不会以任何有意义的方式对集合进行排序。
在您的特定情况下,如果询问比较器对象a
是否在对象b
之前,并且根据您的规则它们看起来相等,则您将返回1(表示a之前的b)。然后,无论出于何种原因,代码会询问您的比较器对象b
是否在对象a
之前,并且它们仍然相等,您仍然返回1(意味着在b之前),您将得到不一致结果