![](/img/trans.png)
[英]how to do Collections.binarySearch on a collection of byte arrays?
[英]How do these two generic signatures for Collections.binarySearch differ?
這是Java中Collections.binarySearch
的定義:
static <T> int binarySearch(List<? extends Comparable<? super T> list, T key)
static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
它們與以下定義(與Collections.sort
相似)有何不同:
static <T extends Comparable<? super T>> int binarySearch(List<T> list, T key)
static <T> int binarySearch(List<T>, T x, Comparator<? super T>)
據我了解:
第一個定義使您可以在值列表中搜索類型T的鍵,這些鍵的類型與某個類型的“低”類型相同,或者知道該類型如何比較T類型的實例或某個“上方”類型的實例。
第二個定義使您可以使用比較器來搜索值列表中類型T的鍵,該值的類型與類型T相同或“低於”類型的Comparator
知道如何比較類型T的實例或某些“上方”類型的實例。
基本上,我不理解的是為什么為什么列表內容不被強制具有與鍵相同的類型?
第一組簽名較為籠統。 它適用於奇數邊緣情況,第二種情況會拒絕。 考慮以下情況
import java.sql.Timestamp; // extends Date implements Comparable<Date> (!)
import java.util.Date;
List<Timestamp> timestamps = ...;
Date key = ...;
int index = Collections.binarySearch(timestamps, key);
這適用於第一個簽名,但在第二個簽名下將被視為類型錯誤(您必須先將key
轉換為Timestamp
)。
這可能很少見,但是如Timestamp
和Date
的示例所示,JDK中有一些示例。
也許,這有助於記住, binarySearch
永遠不需要將列表的元素與列表的其他元素進行比較。 它只將列表的元素與給定的key
進行比較,因此,有必要要求列表元素與key
(而不是彼此)具有可比性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.