我如何使用二进制搜索添加包含特定字符串前缀的排序数组的元素,并将这些元素作为它们在数组中出现的顺序添加到arraylist中。
编码并不难,但我在二进制搜索方面遇到困难。要使用字符串前缀,String类提供startswith。我只需要帮助就可以启动二进制搜索
public static <T extends Comparable<T>> ArrayList prefixMatch(T[] list,
String prefix) {
}
答案 0 :(得分:2)
使用API中的binarySearch方法。
String[] objString = {"a","b","c"};
System.out.println(Arrays.binarySearch(objString,"c"));
或者,如果您想创建自己的二进制搜索实现。在这里。
/* BinarySearch.java */
public class BinarySearch {
public static final int NOT_FOUND = -1;
public static int search(int[] arr, int searchValue) {
int left = 0;
int right = arr.length - 1;
return binarySearch(arr, searchValue, left, right);
}
private static int binarySearch(int[] arr, int searchValue, int left, int right) {
if (right < left) {
return NOT_FOUND;
}
/*
int mid = mid = (left + right) / 2;
There is a bug in the above line;
Joshua Bloch suggests the following replacement:
*/
int mid = (left + right) >>> 1;
if (searchValue > arr[mid]) {
return binarySearch(arr, searchValue, mid + 1, right);
} else if (searchValue < arr[mid]) {
return binarySearch(arr, searchValue, left, mid - 1);
} else {
return mid;
}
}
}
public class BinarySearchTest {
public static void main(String[] args) {
int[] arr = {1, 5, 2, 7, 9, 5};
Arrays.sort(arr);
System.out.println(BinarySearch.search(arr, 2));
}
}
答案 1 :(得分:0)
我有一个类似的要求 - 给定字符串数组找到每个字符串的索引,以新字母开头,即Africa Angela Beach Bamboo Zorro
,我需要算法返回[ 0, 2, 4 ]
我发现有一个众所周知的二进制搜索算法的修改,它使用'延迟相等测试',这有找到确切需要的索引的副作用 - 启动范围的索引。
你可以在this Wikipedia article中阅读它(也有一个基于我自己实现的非常简单的例子)。