Java 使用BinarySearch进行前缀搜索

Java 使用BinarySearch进行前缀搜索,java,Java,使用前缀字符串,我需要使用BinarySearch显示ArrayList中所有可能的字符串。能告诉我怎么走吗 BinarySearch(myList, SearchString); 对于每个字符串前缀和非空的字符串后缀应用前缀

使用前缀字符串,我需要使用BinarySearch显示ArrayList中所有可能的字符串。能告诉我怎么走吗

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
中查找以给定前缀开头的所有字符串?并且您需要使用二进制搜索来执行此操作?我不确定我是否理解这些要求。您被困在哪里了?您尝试过什么吗?