Java 单词前缀字符串超出范围的二进制搜索

Java 单词前缀字符串超出范围的二进制搜索,java,Java,我有一个程序,可以创建一个类字典,在这个类字典中,它用命令行参数中按字母顺序给出的单词填充和排列字符串列表,所有长度都不同。无论如何,作为回溯方法的一部分,我需要实现二进制搜索以在字典中查找前缀。当前缀比字典中的单词长时,我会遇到问题——我试图调整二进制搜索以适应这种情况,但结果不正确。我对二进制搜索的理解还不足以解决这个问题。如果我不考虑前缀比单词长的问题,那么.subString会生成字符串indexoutofbounds。任何帮助都将不胜感激 public int searchPrefix

我有一个程序,可以创建一个类字典,在这个类字典中,它用命令行参数中按字母顺序给出的单词填充和排列字符串列表,所有长度都不同。无论如何,作为回溯方法的一部分,我需要实现二进制搜索以在字典中查找前缀。当前缀比字典中的单词长时,我会遇到问题——我试图调整二进制搜索以适应这种情况,但结果不正确。我对二进制搜索的理解还不足以解决这个问题。如果我不考虑前缀比单词长的问题,那么.subString会生成字符串indexoutofbounds。任何帮助都将不胜感激

public int searchPrefix(String prefixKey){
    int minIndex=0;
    int maxIndex= newDictionary.size()-1;
    return searchPrefix( prefixKey, minIndex,maxIndex);
}

public int searchPrefix(String prefixKey, int minIndex, int maxIndex){
    if(minIndex>maxIndex){
        return-1;
    }
    int midIndex=(maxIndex-minIndex)/2+minIndex;
    if (prefixKey.length()>newDictionary.get(midIndex).length()){
        return searchPrefix( prefixKey, midIndex+1,maxIndex);
    }
    else if(newDictionary.get(midIndex).length(<prefixKey.length()&&newDictionary.get(midIndex).compareTo(prefixKey.substring(0,newDictionary.get(midIndex).length()))>0){
        return searchPrefix(prefixKey,minIndex,maxIndex);
    }
    else if(newDictionary.get(midIndex).substring(0,prefixKey.length()).compareTo(prefixKey)>0){
        return searchPrefix(prefixKey,minIndex,maxIndex-1);
    }
    else if(newDictionary.get(midIndex).length()<prefixKey.length()&&newDictionary.get(midIndex).compareTo(prefixKey.substring(0,newDictionary.get(midIndex).length()))<0){
        return searchPrefix(prefixKey,minIndex,maxIndex);
    }
    else if(newDictionary.get(midIndex).substring(0,prefixKey.length()).compareTo(prefixKey)<0){
        return searchPrefix( prefixKey, midIndex+1,maxIndex);
    }
    else 
        return midIndex;
}
从Collections类中获取binarySearch方法,并根据需要进行修改

private static int binarySearch(List<String> list, String key) {
    int low = 0;
    int high = list.size() - 1;
    while (low <= high) {
        int mid = (low + high) >>> 1;

        String midVal = list.get(mid);

        int cmp = -1;

        if (midVal.length() > key.length())
            cmp = midVal.substring(0, key.length()).compareTo(key);
        else
            cmp = key.substring(0, midVal.length()).compareTo(midVal) * -1;

        if (cmp < 0)
            low = mid + 1;
        else if (cmp > 0)
            high = mid - 1;
        else
            return mid; // key found
    }
    return -1; // key not found
}

希望这能对您有所帮助。

字符串方法compareTo可以处理不同长度的字符串值,例如ABC在ABC之前,因此您的方法中的所有大小写区分都不是必需的

语句的级联开始:

if (prefixKey.length() > newDictionary.get(midIndex).length()){
    return searchPrefix( prefixKey, midIndex+1,maxIndex);
}
else if(newDictionary.get(midIndex).length() < prefixKey.length() && ...
在任何情况下,都不应使用与传递给当前调用的参数完全相同的参数进行递归调用:无限递归结果

为什么不能使用Arrays.binarySearch


我真的不能提出改进的建议,因为你还没有描述这个问题。请提供一个示例,给出一个小字典和一组具有预期结果的键。

我认为这没有用。给定一个字典abc,abcd,abcde…abcdefgh,键abc位于索引2。OP没有为任何可靠的编码提供足够的输入。是的,这就像检查包含内容一样,查看字典可能有助于做出决定。@Amy Gold如果您有兴趣,可以共享字典吗
return searchPrefix(prefixKey,minIndex,maxIndex);