Java Collections.binarySearch()是否返回与键完全相等的值
如果调用Java Collections.binarySearch()是否返回与键完全相等的值,java,collections,Java,Collections,如果调用Collections.binarySearch(sortedList,key,compareMethod),则返回索引中的项目“x”(如果索引为正): 1.)为其找到的第一个值key=x(如key.equals(x)) 或 2.)找到的第一个值,其compareMethod(键,x)=0 或 3)以上两项都没有 我的具体问题是: 我有一个list点的列表,每个点都有一个(x,y)坐标对。我使用自定义比较器方法compareX()按照增加x坐标的顺序对列表进行排序 Point相等(Po
Collections.binarySearch(sortedList,key,compareMethod)
,则返回索引中的项目“x”(如果索引为正):
1.)为其找到的第一个值key=x
(如key.equals(x))
或
2.)找到的第一个值,其compareMethod(键,x)=0
或
3)以上两项都没有
我的具体问题是: 我有一个
list
点的列表,每个点都有一个(x,y)
坐标对。我使用自定义比较器方法compareX()
按照增加x
坐标的顺序对列表进行排序
Point
相等(Point.equals()
)定义为相同的x
和y
坐标
现在,我想
binarySearch
我的key
列表,所以我调用集合。binarySearch(list,key,compareX)
-如果找到点
,是否保证有x=key.x
和y=key.y
,或者仅仅是x=key.x
?binarySearch
方法将基于比较器来测试相等性,而不是基于equals
引入了比较器
与等于
一致的概念;当a
的所有可能值a
和b
的a等于a时,两者是一致的<代码>比较器
s与等于
不一致时,应谨慎使用,并尽可能避免使用
1.)为其key=x(如key.equals(x))找到的第一个值,或
2.)找到的第一个值,其compareMethod(键,x)=0,或
如果存在多个compareMethod(key,x)==0的值,则两者都不是。它将返回其中一个值,但不确定是哪一个。
从:
如果列表包含多个等于指定对象的元素,则无法保证会找到哪个元素
至于你问题的另一部分,,
如果compareMethod
仅比较x
,
那么您得到的唯一保证就是x=key.x
如果您使用的compareMethod
在x
和y
上使用一致的比较逻辑,那么如果存在这样的点,您将保证获得x=key.x
和y=key.y
。
例如:
Comparator<Point> cmp = (p1, p2) -> {
int cmpx = Integer.compare(p1.x, p2.x);
if (cmpx != 0) {
return cmpx;
}
return Integer.compare(p1.y, p2.y);
};
比较器cmp=(p1,p2)->{
int cmpx=整数。比较(p1.x,p2.x);
如果(cmpx!=0){
返回cmpx;
}
返回整数。比较(p1.y,p2.y);
};
在这里回答我自己的问题,收集不同答案中的内容,并提供清晰的解释:
如Collections.binarySearch()
所示,所有的比较都是使用比较器方法完成的,因此如果比较(x,y)==0,则认为x
和y
相等
通常,这意味着如果Collections.binarySearch()
返回一个肯定的结果,那么它将是Comparator
返回0的某个值的位置。如果有多个这样的值,那么哪一个是未定义的
特别是对于我的情况:如问题中所述,调用Collections.binarySearch()
将返回带有x=key.x
的一些点的索引,如果存在这样的点
正确的解决方案是更新我的xCompare
方法,以便它比较x
坐标-如果它们不相等,它将返回该比较。否则,它将比较y
坐标。这使得比较器将首先通过x
坐标进行比较,然后(对于具有相同x
的任何点
s)通过y
坐标进行比较
这将导致排序和搜索,首先通过x
,然后通过y
,当且仅当x
和y
相等时,比较结果返回0。我已经读了你的问题好几遍了,我知道,但我不太明白你想做什么。为什么您传递的比较器不进入binarySearch()
比较x坐标和y坐标?@Mick助记符列表本身仅按x坐标排序-您是否暗示确保结果的唯一方法是让比较器先按x坐标再按y坐标进行比较?是,JavaDoc和janos的回答应该说明这一点。binarySearch方法将基于比较器测试相等性,而不是基于相等性。你有证据吗?@MyStackRunnethOver源代码可以作为证据吗?从逻辑上讲,这显然是正确的,但我很惊讶文档中没有明确说明。@MyStackRunnethOver我的证据是我在发布之前为确认这个答案而编写的测试。虽然澄清的问题当然是受欢迎的,但要求我出示证据的评论是没有帮助的,充其量只能导致社区拒绝回答你未来的任何问题。你在这里做的是毫无根据的断言。我不认为要求证据有什么问题。如果你写了一个测试,为什么不包括它或者至少提到它?此外,通常情况下,测试是相对薄弱的证据。未指定的行为可能因版本、实现或执行而异。您能定义“一致比较逻辑”的含义吗?@MyStackRunnethOver我更新了我的帖子,希望更清楚。通过一致的比较逻辑,我的意思是如果cmp(a,b)<0
当且仅当a.x
或a.x==b.x&&a.y
,并且使用类似的逻辑为cmp(a,b)>0
@MyStackRunnethOver添加了一个示例点比较器实现,如果有帮助的话。我已经准备好了,谢谢你