2013-04-18 166 views
1

如何对二进制搜索的字符串数组进行排序。下面我总是会收到一个负号,而不是正确的索引。请帮忙?如果该单词不在数组中,则返回-1。二进制搜索字符串数组

public static int binary (String [] theword, String a) { 
    int index = -1; 
     Arrays.sort(theword); 
     Arrays.toString(theword); 
     index = Arrays.binarySearch(theword, a); 
    return index; 

} 
+2

检查了代码,它返回了正确的结果以供我的测试数据使用。你能分享你传递的价值吗? – prashant

+0

@prashant我正在阅读一个文件,然后搜索这个词。我寻找他的单词“to”,它返回-11而不是11 – user2291022

+1

你可以改变你的代码来输出数组的内容和'a',然后在这里发布输出 –

回答

3

它的工作原理,请参阅下面

public static void main(String... args) { 

    String words[] = { "abc3", "abc2", "abc1", "abc4" }; 

    Arrays.sort(words); 
    System.out.println(Arrays.toString(words)); 
    { 
     String word = "abc3"; 
     int index = Arrays.binarySearch(words, word); 
     index = index >= 0 ? index : -1; 
     System.out.println(word + " = " + index); 
    } 
    { 
     String word = "abc11"; 
     int index = Arrays.binarySearch(words, word); 
     index = index >= 0 ? index : -1; 
     System.out.println(word + " = " + index); 
    } 
} 

输出

[abc1, abc2, abc3, abc4] 
abc3 = 2 
abc11 = -1 

您从排序的数组中返回的索引,而你需要从原始数组的索引。

1

文档状态为Arrays.binarySearch()返回值如下:

返回:
的搜索键的索引中,如果包含在数组中;否则,( - (插入点)-1)。插入点被定义为键将被插入到数组中的点: 大于键的第一个元素,或者如果数组中的所有元素 小于指定的键,则为a.length。请注意,当且仅当找到密钥 时,此 可确保返回值> = 0。

很明显,你的单词“to”没有被二进制搜索找到。而且,如果它存在了,它将会是这个阵列的第10个索引。作为-(10) -1 == -11

还有就是你正在寻找然而,阵列中的数据包含单词to与它周围的一些空间给你二进制搜索的不想要的,但正确的,结果这个词to一个很好的可能性。

1

我看到的一个常见错误是将一个空格添加到相关单词中。在添加到数组之前,在每个单词上应用trim()函数。

+0

是的,我也在想这个。除非我们看到更多的代码/输出,否则无法确定。 – iamnotmaynard

+0

@prashant这是问题,但我如何将它应用于上述方法。当我将它们存储在数组中时,我使用了trim,但当它传递到方法中时它不起作用 – user2291022

+0

手动线性搜索是否找到“to”?我怀疑,如果Java官方二进制搜索方法找不到它。你只需要修整一次。在将数组放入数组之前进行修整是您所需要做的。 – Sanchit