簡體   English   中英

Collections.binarySearch()是否返回與鍵完全相同的值

[英]Does Collections.binarySearch() return the exact equal of key

如果我調用Collections.binarySearch(sortedList, key, compareMethod) ,則它是返回索引處的項“ x”(如果索引為正):

1.)找到第一個key = x (如key.equals(x)所示)

要么

2.)找到的第一個值,其compareMethod(key, x) == 0

要么

3.)以上都不是嗎?


我的具體問題:

我有一個Pointlist ,每個Point具有一個(x,y)坐標對。 我使用自定義Comparator方法compareX()以增加x坐標的順序對列表進行排序。

Point相等( Point.equals() )被定義為相同的xy坐標

現在,我想對key列表進行binarySearch ,所以我調用Collections.binarySearch(list, key, compareX) -如果找到了Point ,是否保證x = key.x y = key.y ,或者只是x = key.x嗎?

1.)找到第一個鍵= 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);
};

binarySearch方法將基於Comparator而不是equals來測試equals

Javadoc for Comparator引入了Comparatorequals一致的概念; a.equals(b)a.compareTo(b) == 0對於ab所有可能值相同時,兩者是一致的。 equals不一致的Comparator應謹慎使用,並在可能的情況下避免使用。

在這里回答我自己的問題,收集不同答案中所說的內容,並提供明確的解釋:

Collections.binarySearch() 源代碼所示所有比較都是使用Comparator方法完成的-因此,如果Compare(x,y) == 0 ,則xy被視為相等。

通常,這意味着如果Collections.binarySearch()返回肯定的結果,它將是Comparator返回0的某個值的位置。如果有多個這樣的值,則該值未定義。


對於我的情況具體是:寫在這個問題中,調用Collections.binarySearch()會返回一些指數Pointx = key.x ,如果這樣的Point存在。

正確的解決方案是更新xCompare方法,以便比較x坐標-如果它們不相等,則返回該比較。 否則,它將比較y坐標。 這樣, Comparator將首先通過x坐標進行比較,然后(對於具有相同x任何Point )通過y坐標進行比較。

這將導致排序和搜索,首先是x ,然后是y ,當且僅當xy相等時,比較才返回0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM