[英]How to perform a binarySearch with a comparator?
我正在嘗試使用不區分大小寫的比較器執行二進制搜索,但無論我嘗試什么,我都會遇到錯誤......
試驗一:
Arrays.binarySearch(arr, "text", String::compareToIgnoreCase);
資料來源: https://stackoverflow.com/a/30191946/900394
這給出了一個錯誤:
語言級別“7”不支持方法引用
假設我想使用 Java 7,我嘗試了以下其他方法:
試驗 2 :
Comparator<String> caseInsensitiveComparator = new Comparator<String>() {
@Override
public int compare(String s, String t1) {
return s.compareToIgnoreCase(t1);
}
};
Arrays.binarySearch(arr, "text", caseInsensitiveComparator);
資料來源: https://stackoverflow.com/a/14154185/900394
錯誤:
所需類型:比較器<? 超級對象>
提供:比較器
請注意,此方法適用於對列表進行排序(即此比較器適用於Collections.sort()
)
試驗 3:
Arrays.binarySearch(arr, "text", String.CASE_INSENSITIVE_ORDER);
來源: https://stackoverflow.com/a/17491652/900394
錯誤:
所需類型:比較器<? 超級對象>
提供:比較器
請注意,此方法也適用於Collections.sort()
試驗四:
構建一個實現Comparator<String>
的 class :
public class CaseInsensitiveComparatorClass implements Comparator<String> {
@Override
public int compare(String s, String t1) {
return s.compareToIgnoreCase(t1);
}
}
Arrays.binarySearch(arr, "text", new CaseInsensitiveComparatorClass ());
資料來源: https://stackoverflow.com/a/30191797/900394
錯誤:
所需類型:比較器<? 超級 java.lang.Object>
提供:CaseInsensitiveComparatorClass
請注意,此方法也適用於Collections.sort()
您能否為我提供一種有效的方法,或者指出我做錯了什么?
編輯:
這是arr
的聲明:
private List<String> lst;
所以它實際上是一個列表,我在方法調用時將其轉換為數組:
Arrays.binarySearch(lst.toArray(),...
regarding your first example, you use method reference feature from Java 8 ( String::compareToIgnoreCase
), but you compile/execute code with Java 7. change version of Java at least to Java 8. also keep in mind, that before using Arrays.binarySearch
,你的數組應該被排序。
對於收集,您可以使用以下方法: Collections.binarySearch()
為了將列表轉換為具有泛型參數的數組,請使用以下命令:
lst.toArray(new String[0]);
您實際上有一個列表,而不是一個數組: List<String>
。 使用Collections.binarySearch
而不是將列表轉換為數組,然后是Arrays.binarySearch
。
List<String> lst = Arrays.asList("a", "text", "z"); // just an example list
int index = Collections.binarySearch(lst, "text", String.CASE_INSENSITIVE_ORDER);
如果出於某種愚蠢的原因您必須使用Arrays.binarySearch
,您可以將具體列表類型作為參數傳遞給List.toArray
。 這將使該方法返回一個字符串數組而不是一個對象數組:
Arrays.binarySearch(lst.toArray(new String[0]), String.CASE_INSENSITIVE_ORDER)
注意數組要按照 Arrays.binarySearch Javadoc 排序:
使用二分搜索算法在指定數組中搜索指定的 object。 在進行此調用之前,必須根據指定的比較器(如通過 sort(T[], Comparator) 方法)對數組進行升序排序。 如果未排序,則結果未定義。 如果數組包含多個等於指定 object 的元素,則無法保證會找到哪一個。
String 本身實現了 Comparable 接口,所以,沒有必要實現一個新的
這是可視化如何使用 Arrays.binarySearch 的簡短代碼片段。
public class BinarySearch {
public static void main(String[] args) {
final String[] arr = {"one", "two", "three", "four", "text"};
Arrays.sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
System.out.println(Arrays.binarySearch(arr, "text", String.CASE_INSENSITIVE_ORDER));
}
}
試試這個代碼:
String[] arr = {"a","b","c"};
int i = Arrays.binarySearch(arr, "B", new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareToIgnoreCase(o2);
}
});
System.out.println(i);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.