Java 通过另一个数组对数组进行二进制搜索的最佳方法是什么?
在可以通过间接方式访问的数组中进行二进制搜索的最佳方法是什么?Java 通过另一个数组对数组进行二进制搜索的最佳方法是什么?,java,arrays,string,algorithm,binary-search,Java,Arrays,String,Algorithm,Binary Search,在可以通过间接方式访问的数组中进行二进制搜索的最佳方法是什么? 这意味着我有一个整数[],它存储表示字符串[]的排序版本的字符串[] 例如,Integer[]idxes={5,4,0,3,1,2},这意味着String[5]或String[idxes[0]]在词典中是最低的字符串。 我希望描述清楚。 如果字符串是字符串[]单词的一部分,那么通过idexes对字符串进行二进制搜索的最佳方法是什么 我所做的是: int pos = Arrays.binarySearch(idexes, -1, ne
这意味着我有一个
整数[]
,它存储表示字符串[]
的排序版本的字符串[]
例如,
Integer[]idxes={5,4,0,3,1,2}
,这意味着String[5]
或String[idxes[0]]
在词典中是最低的字符串。我希望描述清楚。
如果字符串是
字符串[]单词的一部分,那么通过idexes
对字符串进行二进制搜索的最佳方法是什么
我所做的是:
int pos = Arrays.binarySearch(idexes, -1, new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
if(o1 == -1){
return k.compareTo(words[o2]);
}
else{
return words[o1].compareTo(k);
}
}
});
int pos=Arrays.binarySearch(idexes,-1,新的比较器(){
@凌驾
公共整数比较(整数o1,整数o2){
如果(o1==-1){
返回k.compareTo(单词[o2]);
}
否则{
返回单词[o1]。比较到(k);
}
}
});
其中,k
是搜索词,words[]
是我前面提到的String[]
。
这是可行的,但我不喜欢在binarySearch
api中传递的-1
。
有没有更好的办法 class SortedListView扩展了AbstractList实现了随机访问{
class SortedListView extends AbstractList<String> implements RandomAccess {
// stringArray, idxes should be fields, initialized in a constructor
public int size() {
return stringArray.length;
}
public String get(int index) {
return stringArray[idxes[index]];
}
};
//stringArray,IDX应该是字段,在构造函数中初始化
公共整数大小(){
返回stringArray.length;
}
公共字符串get(int索引){
返回stringArray[idx[index]];
}
};
然后,您可以在列表上使用集合。binarySearch
从技术上讲,这不是一个答案,但将字符串数组和索引数组封装到自己的类中至少有助于对应用程序的其余部分隐藏此实现细节。我也不认为它有那么糟糕,它看起来不好看,但它相对简单,特别是添加了一些解释原理的注释。尽管如此,如果你经常搜索同一个数组,你最好创建一个排序副本。+1!一个问题。为什么扩展AbstractList
而不是实现List
?如果您只是实现List
,那么您需要单独实现每个List
方法——至少有十几种不同的方法<代码>抽象列表
为您填充该框架。起初我认为一个匿名类就足够了,但对于集合。binarySearch
您确实需要实现RandomAccess
以获得最佳结果,因此您需要一个实际命名的类。