Collections.binarySearch()是否返回完全相等的键

时间:2017-08-09 21:12:05

标签: java collections

如果我调用Collections.binarySearch(sortedList, key, compareMethod),则返回索引处的项目为“x”(如果索引为正数):

1。)找到key = x的第一个值(如key.equals(x)中所示)

2。)找到compareMethod(key, x) == 0

的第一个值

3。)以上都没有?

我的具体问题:

我有listPoint列表,每个列表都有一个(x,y)坐标对。我使用自定义比较器方法x按照增加compareX()坐标的顺序对列表进行排序。

Point平等(Point.equals())定义为相同的xy坐标

现在,我想binarySearch key我的列表,因此我致电Collections.binarySearch(list, key, compareX) - 如果找到Point,是否保证x = key.x } y = key.y,或只是x = key.x

2 个答案:

答案 0 :(得分:0)

  

1。)找到key = x的第一个值(如key.equals(x)中所示)或

     

2。)找到的第一个值为compareMethod(key,x)== 0或

如果有多个compareMethod(key, x) == 0值,也不会。它将返回其中一个值,但它未确定哪个值。 来自JavaDoc

  

如果列表包含多个与指定对象相等的元素,则无法保证找到哪个元素。

至于你问题的其他部分, 如果compareMethod仅比较x, 那么唯一的保证就是x = key.x

如果您使用compareMethodxy使用一致比较逻辑,那么您将获得x = key.xy = 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) == 0x和{{ 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是平等的。