在字符串数组中搜索单词并使用二进制搜索技术给出其位置

Search for a Word in an Array of strings & give its position using Binary Search Technique

问题是使用二进制搜索技术搜索一个词并给出它的位置。我接受数组中的所有词,然后使用[=18=对它们进行排序]Arrays.sort。然后我使用 binarySearch() 函数搜索用户接受的词,但该词的位置显示不正确。 它提供随机输出,我不明白为什么!我写 for 循环的方式可能有问题! 我附上了一个带有多个输出的输出屏幕。

如果有人能帮助我,那就太好了!谢谢 :)

import java.util.*;
import java.util.Arrays;

public class BinarySearch10
{

public static void main(String[] args) 
{
   Scanner sc = new Scanner(System.in);
   int i;  

   System.out.println("Enter number of words you wish to input: ");
   int n=sc.nextInt();

   String[] words= new String[n];

   System.out.println("Enter the words");
   for ( i = 0; i < words.length; i++)
   {
       System.out.print("WORD " + (i + 1) + ": ");
       words[i] = sc.next();
   }

   System.out.println("enter the word you want to search for");
   String word=sc.next();

   Arrays.sort(words);


   int index= Arrays.binarySearch(words,word);
   System.out.println(word+ "="+ index);


}

您正在获取随机值,因为您首先对数组进行排序,

排序后索引发生变化

因为Arrays.sort是in-place排序。这意味着当你对单词进行排序时,它们的位置已经改变:新的顺序将是字典顺序(字母顺序)。这是一个例子:

// before the sort
// words = ["word-b", "word-c", "word-a"]

Arrays.sort(words);

// after the sort
// words = ["word-a", "word-b", "word-c"]

如您所见,单词 word-c 的位置已从索引 1 更改为索引 2。

解决方案 1

一个简单的解决方案是避免在此处使用排序和二分查找。您可以使用 for 循环查找单词:

for (int i = 0; i < words.length; i++) {
    if (searchWord.equals(words[i])) {
        // word found at index i
    }
}

解决方案 2

如果你想继续你的工作使用排序,你需要使用一个Map来存储每个单词的初始位置(索引):映射的键是单词,值是map是单词初始索引。

根据附图,输出似乎是正确的。按字母顺序排列数组后(使用 Array.sort()),元素的顺序将是: 是,你好,如何,你。 "you" 的索引为 3,如输出中所示。第二个示例相同,其中 "are" 的索引为 0.