[英]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.)以上都不是嗎?
我的具體問題:
我有一個Point
的list
,每個Point
具有一個(x,y)
坐標對。 我使用自定義Comparator方法compareX()
以增加x
坐標的順序對列表進行排序。
Point
相等( Point.equals()
)被定義為相同的x
和y
坐標
現在,我想對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
如果您使用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);
};
binarySearch
方法將基於Comparator
而不是equals
來測試equals
。
Javadoc for Comparator引入了Comparator
與equals
一致的概念; 當a.equals(b)
與a.compareTo(b) == 0
對於a
和b
所有可能值相同時,兩者是一致的。 與equals
不一致的Comparator
應謹慎使用,並在可能的情況下避免使用。
在這里回答我自己的問題,收集不同答案中所說的內容,並提供明確的解釋:
如Collections.binarySearch()
源代碼所示 , 所有比較都是使用Comparator方法完成的-因此,如果Compare(x,y) == 0
,則x
和y
被視為相等。
通常,這意味着如果Collections.binarySearch()
返回肯定的結果,它將是Comparator
返回0的某個值的位置。如果有多個這樣的值,則該值未定義。
對於我的情況具體是:寫在這個問題中,調用Collections.binarySearch()
會返回一些指數Point
與x = key.x
,如果這樣的Point
存在。
正確的解決方案是更新xCompare
方法,以便比較x
坐標-如果它們不相等,則返回該比較。 否則,它將比較y
坐標。 這樣, Comparator
將首先通過x
坐標進行比較,然后(對於具有相同x
任何Point
)通過y
坐標進行比較。
這將導致排序和搜索,首先是x
,然后是y
,當且僅當x
和y
相等時,比較才返回0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.