二进制搜索问题

时间:2014-09-26 19:12:15

标签: java binary-search

我目前正致力于课程编程项目的最后一部分。程序必须用户输入2-10个字符(仅字母)并递归创建所有可能的排列,然后与字典文件交叉检查单词是否有效并打印有效单词。

当我在测试期间将它打印出来时,二进制搜索功能似乎工作得很好但是当我尝试实现for循环来删除无效的单词时,事情变得很奇怪。

 for (int i = 0; i < length; i++) {
        if (Dictionary.binarySearch(dictionary, words.get(i), 0, dictionary.size() - 1) == -1) {
            words.remove(i);
        }

我试图通过将二元搜索函数的返回值转移到另一个数组来仔细检查发生了什么,即

for (int i = 0; i < length; i++) {
        if (Dictionary.binarySearch(dictionary, words.get(i), 0, dictionary.size() - 1) != -1) {
            indices.add(Dictionary.binarySearch(dictionary, words.get(i), 0, dictionary.size()-1));
            System.out.println(indices.get(i));
        }

当我打印出用户输入e,a,t的实例的二进制搜索功能的结果时,我得到:

20949 22814 22813 -1 -1 899 3812 3786 -1 69054 -1 68389 68256 -1

这正是我正在寻找的

但是当我打印出arrayList索引时,它会显示为:

[20949,20949,20949,20949,20949,20949,20949,20949,20949,20949,22814]

因此,如果有人可以根据binarySearch函数返回的内容帮助我摆脱arrayList“words”中的单词,我会非常感激。

感谢先进的任何帮助和批评!

1 个答案:

答案 0 :(得分:1)

看起来你的问题就在这里:

words.remove(i);

当你这样做时,单词少了一个元素,words.get(i)(在i递增之前)将返回下一个值。但是,您正在递增i,因此您正在跳过该元素。

对此的两个常见解决方案是在删除元素后递减ilength,或者在i处启动length - 1并递减它直到达到0