【问题标题】:Search for a Word in an Array of strings & give its position using Binary Search Technique在字符串数组中搜索单词并使用二进制搜索技术给出其位置
【发布时间】:2017-02-16 10:34:13
【问题描述】:

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


}

【问题讨论】:

    标签: java arrays string sorting binary-search


    【解决方案1】:

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

    【讨论】:

    • 也许在数组排序后打印所有单词会有帮助?
    • 当然可以。您还可以添加索引... Arrays.sort(words); for(int i = 0; i
    • 啊哈!有效!非常感谢:) 这是一个简单的解决方法!从来没想过!!如果您不介意,我需要其他帮助!如果我想接受更大的字符串,而不是只接受一个词,那么我必须做出哪些改变?
    • 我不太明白你所说的“接受更大的字符串”是什么意思
    • 喜欢搜索更大的字符串,而不仅仅是一个词:1. 你好,你好吗 2. 你的名字是 Waddah 3. 我想见你……这是否令人困惑,我很抱歉!我是java中的菜鸟
    【解决方案2】:

    你得到随机值是因为你首先对数组进行排序,

    排序后索引发生变化

    【讨论】:

    • 好的,谢谢!我会删除它,我可以做些什么来纠正我的输出。有一个小错误阻止了输出屏幕链接的显示。你可能想看看!
    【解决方案3】:

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

    // 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的key是word,map的value是word初始索引。

    【讨论】:

    • 感谢您的回答!我希望我能用那个!它更简单,而且我以前也练习过,但我的项目要求使用二进制搜索技术!我会设法做到这一点!
    • @user58736 我添加了第二个解决方案,希望对您有所帮助。
    猜你喜欢
    • 2013-09-13
    • 1970-01-01
    • 2013-11-28
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2013-05-22
    • 1970-01-01
    相关资源
    最近更新 更多