如果我调用Collections.binarySearch(sortedList, key, compareMethod)
,则返回索引处的项目为“x”(如果索引为正数):
1。)找到key = x
的第一个值(如key.equals(x)中所示)
或
2。)找到compareMethod(key, x) == 0
或
3。)以上都没有?
我的具体问题:
我有list
个Point
列表,每个列表都有一个(x,y)
坐标对。我使用自定义比较器方法x
按照增加compareX()
坐标的顺序对列表进行排序。
Point
平等(Point.equals()
)定义为相同的x
和y
坐标
现在,我想binarySearch
key
我的列表,因此我致电Collections.binarySearch(list, key, compareX)
- 如果找到Point
,是否保证x = key.x
} 和 y = key.y
,或只是x = key.x
?
答案 0 :(得分:0)
1。)找到key = x的第一个值(如key.equals(x)中所示)或
2。)找到的第一个值为compareMethod(key,x)== 0或
如果有多个compareMethod(key, x) == 0
值,也不会。它将返回其中一个值,但它未确定哪个值。
来自JavaDoc:
如果列表包含多个与指定对象相等的元素,则无法保证找到哪个元素。
至于你问题的其他部分,
如果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);
};
答案 1 :(得分:-1)
在这里回答我自己的问题,收集不同答案中说的东西,并提供一个明确的解释:
正如Collections.binarySearch()
source code中所证明的那样,所有比较都是使用比较器方法完成的 - 所以如果Compare(x,y) == 0
,x
和{{ 1}}被认为是平等的。
通常,这意味着如果y
返回肯定结果,那么{strong>某些值的位置Collections.binarySearch()
将返回0.如果有多个这样的价值,其中一个是未定义的。
对于我的具体案例:如问题中所述,如果存在Comparator
,则Collections.binarySearch()
的调用将返回Point
的某些x = key.x
的索引。
正确的解决方案是更新我的Point
方法,以便比较xCompare
坐标 - 如果它们不相等,则返回该比较。否则,它会比较x
坐标。这样,y
将首先按Comparator
坐标进行比较,然后(对于x
}具有相同Point
} x
坐标的任何y
进行比较。< / p>
这将导致排序和搜索,首先是x
,然后是y
,其中当且仅当x
和{{1}时,比较返回0是平等的。