在字符串数组中搜索单词并使用二进制搜索技术给出其位置
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.
问题是使用二进制搜索技术搜索一个词并给出它的位置。我接受数组中的所有词,然后使用[=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.