Java 使用BinarySearch进行前缀搜索
使用前缀字符串,我需要使用BinarySearch显示ArrayList中所有可能的字符串。能告诉我怎么走吗Java 使用BinarySearch进行前缀搜索,java,Java,使用前缀字符串,我需要使用BinarySearch显示ArrayList中所有可能的字符串。能告诉我怎么走吗 BinarySearch(myList, SearchString); 对于每个字符串前缀和非空的字符串后缀应用前缀
BinarySearch(myList, SearchString);
对于每个
字符串
前缀
和非空的字符串
后缀
应用前缀
因此,您可以使用来搜索前缀的位置。当然,前缀的存在或不存在并不能说明前缀+后缀的存在或不存在。因此,如果索引为负数,请使用-index-1
对其进行转换,并检查该位置是否等于列表的大小(在本例中,未找到前缀字符串
),或者该索引处的字符串是否有前缀。如果索引不是负数,即发现没有后缀的前缀
,则必须决定是否包含后缀为空的字符串
s。由于在多次出现的情况下,binarySearch
将返回一个任意索引,因此您必须使用返回的索引以线性方式转到第一次出现,向后或向前取决于您的决定是否包括不带后缀的前缀
找到第一个位置后,您可以再次使用binarySearch
,通过搜索比任何前缀字符串大的最小字符串来查找所有前缀字符串的结尾。此字符串可以通过将前缀的最后一个字符增加1来构造。这里再次强调的是,不管字符串是否真的存在,它只是为前缀字符串的范围提供了分隔符。因此,您将使用-index-1
转换负值,并使字符串的第一个索引不带前缀;如果不存在此类字符串,则为列表大小
public static List<String> findAllPrefixed(
List<String> list, String prefix, boolean includeEmptySuffixed)
{
int first=Collections.binarySearch(list, prefix);
if(first<0)
{
first=-first-1;
if(first==list.size() || !list.get(first).startsWith(prefix))
return Collections.emptyList();
}
else
{
if(includeEmptySuffixed)
while(first>0 && list.get(first-1).equals(prefix)) first--;
else
{
do first++; while(first<list.size() && list.get(first).equals(prefix));
if(first==list.size() || !list.get(first).startsWith(prefix))
return Collections.emptyList();
}
}
// the conditional is just a small optimization
List<String> notSmaller=first>0? list.subList(first, list.size()): list;
final int p = prefix.length()-1;
if(p<0) return notSmaller;//empty prefix, there are no larger values
final String after=prefix.substring(0, p)+(char)(prefix.charAt(p)+1);
int last=Collections.binarySearch(notSmaller, after);
if(last<0) last=-last-1;
// could just do notSmaller.subList(0,last); but this here reduces heap usage
return last==notSmaller.size()? notSmaller: list.subList(first, first+last);
}
公共静态列表findAllPrefixed(
列表,字符串前缀,布尔includeEmptySuffixed)
{
int first=Collections.binarySearch(列表,前缀);
如果(first0&&list.get(first-1).equals(前缀))first--;
其他的
{
do first++;while(first0?list.subList(first,list.size()):list;
final int p=前缀.length()-1;
如果(pDo)您的意思是您需要在ArrayList
中查找以给定前缀开头的所有字符串?并且您需要使用二进制搜索来执行此操作?我不确定我是否理解这些要求。您被困在哪里了?您尝试过什么吗?