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添加了一个示例点比较器实现,如果有帮助的话。我已经准备好了,谢谢你