Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用字符串前缀实现二进制搜索?_Java_Arrays_String - Fatal编程技术网

Java 使用字符串前缀实现二进制搜索?

Java 使用字符串前缀实现二进制搜索?,java,arrays,string,Java,Arrays,String,如何实现二进制搜索以在泛型数组中查找具有特定前缀的字符串,在本例中,该字符串将是字符串[]。我尝试了compareTo,但是没有用,因为我必须使用字符串前缀。例如字符串前缀Bi BIL BIlard…等 实现以下方法以返回以给定前缀开头的按字母顺序排序的数组中的所有字符串。例如,给定前缀“bi”,返回的字符串是“比尔·克林顿”、“比尔·盖茨”和“比尔·乔伊”。请注意,所有字符串比较都应不区分大小写。返回列表中的字符串必须按照它们在数组中的显示顺序。您的实现必须基于二进制搜索,并且必须在最坏的情况

如何实现二进制搜索以在泛型数组中查找具有特定前缀的字符串,在本例中,该字符串将是字符串[]。我尝试了compareTo,但是没有用,因为我必须使用字符串前缀。例如字符串前缀Bi BIL BIlard…等

实现以下方法以返回以给定前缀开头的按字母顺序排序的数组中的所有字符串。例如,给定前缀“bi”,返回的字符串是“比尔·克林顿”、“比尔·盖茨”和“比尔·乔伊”。请注意,所有字符串比较都应不区分大小写。返回列表中的字符串必须按照它们在数组中的显示顺序。您的实现必须基于二进制搜索,并且必须在最坏的情况下运行Olog n+k time,其中n是数组的长度,k是匹配字符串的数量。假设数组没有重复的条目。如果没有匹配项,则可以返回null或空数组列表

除您可能记得的任何其他方法外,您还可以使用以下字符串方法: 布尔startsWithString s 整数比较字符串 int compareTignoreCaseString s 字符串到较低的字符串s 串头盒串 对于ArrayList,您只需要使用add方法将一个项添加到数组列表的末尾。 您可以根据需要编写带有完整实现的助手方法。您不能调用任何未自己实现的方法

public static <T extends Comparable<T>> ArrayList prefixMatch(T[] list, String prefix) {

        ArrayList<T> result = new ArrayList<T>();
        int lo = 0;
        int hi = list.length - 1;

        while(lo <= hi) {

            int mid = (hi + lo) / 2;

            list[mid].startsWith(prefix) ? 0 : list[mid].compareTo((T) prefix));


        }   

        return null;
    }

我想你现在有这样的东西

arrayElement.compareTo(prefix)
如果是,您可以将其更改为如下所示:

arrayElement.startsWith(prefix) ? 0 : arrayElement.compareTo(prefix)

我想你现在有这样的东西

arrayElement.compareTo(prefix)
如果是,您可以将其更改为如下所示:

arrayElement.startsWith(prefix) ? 0 : arrayElement.compareTo(prefix)

我建议为此研究API代码。有一个Arrays类,您可以在java.lang包中查看并从中学习。

我建议查看此API代码。有一个Arrays类,您可以在java.lang包中查看并从中学习。

您可以使用带有自定义比较器的默认二进制搜索作为基础,然后自行确定范围。我认为正确的算法应该是:

对给定数组执行二进制搜索。使用仅检查前缀的比较器。 结果,您将得到以前缀开头的字符串索引 向左走找到第一个匹配前缀的字符串,记住位置。 向右走,找到与前缀匹配的第一个字符串,记住位置。 将元素从原始数组的范围起点复制到范围终点。这将是具有前缀匹配条件的所有元素的所需数组。 下面是java的实现。它在乐观的情况下工作,但如果我离开这些检查以使代码看起来简单,它将崩溃:

原始数组中不存在具有给定前缀的字符串 存在长度小于前缀长度的字符串 另外,如果您需要二进制搜索实现,可以检查Arrays.binarySearch的源代码


您可以使用默认的二进制搜索和自定义比较器作为您的基础,然后您自己的工作范围。我认为正确的算法应该是:

对给定数组执行二进制搜索。使用仅检查前缀的比较器。 结果,您将得到以前缀开头的字符串索引 向左走找到第一个匹配前缀的字符串,记住位置。 向右走,找到与前缀匹配的第一个字符串,记住位置。 将元素从原始数组的范围起点复制到范围终点。这将是具有前缀匹配条件的所有元素的所需数组。 下面是java的实现。它在乐观的情况下工作,但如果我离开这些检查以使代码看起来简单,它将崩溃:

原始数组中不存在具有给定前缀的字符串 存在长度小于前缀长度的字符串 另外,如果您需要二进制搜索实现,可以检查Arrays.binarySearch的源代码


现在正在处理类似的问题。我相信伪代码会像你的一样。我创作了一首pojo类歌曲。一首歌由三根弦组成:艺术家、标题和歌词

创建歌曲对象时,您会得到:

     //     Artist             Title                     Lyrics..
歌曲a=[农夫布朗,哦'麦当劳,哦'麦当劳有一个农场,呃我哦我哦]

public class Song implements Comparable<Song> {

private String _artist;  
private String _lyrics;
private String _title;

   // constructor
   public Song(String artist, String title, String lyrics) {
   this._artist = artist;
   this._title = title;
   this._lyrics = lyrics;
   }

   public String getArtist() {
       return _artist;
   }

   public String getLyrics() {
       return _lyrics;
   }

   public String getTitle() {
       return _title;
   }

   public String toString() {
       String s = _artist + ", \"" + _title + "\"";
    return s;
   }

   //This compare two song objects
   public int compareTo(Song song) {
       String currentSong = song.toString();
       int x = currentSong.compareToIgnoreCase(this.toString());  
       return x;
   }
这是您的方法,它将接收歌曲数组和前缀,并使用比较方法查看它们是否匹配。如果它们匹配,则compareTo方法返回0。如果你得到0,那么你知道你已经找到了你的歌曲,所以返回arrayOfSongs[找到歌曲的索引]

我还没有编码我的搜索,但我修改了你的匹配我的代码。我还没有测试过。我认为你甚至不需要一个比较方法,但你可以使用它。此外,对于缩放,二进制搜索应返回可能匹配的歌曲列表,因为您可能有多首以xyz开头的歌曲。当你开始用前缀在谷歌上搜索时,你会得到一个下拉菜单dog,donut,double,这给了用户一些选择,比如搜索引擎

    public static ArrayList<Song> search (String[] arrayOfSongs , String enteredPrefix) {
     ArrayList<Song> listOfMatches = new ArrayList<Song>;
     int mid;
     int lo = 0;
     int hi = arrayOfSongs.length - 1;
     while(lo <= hi) 
     {
     mid = (hi + lo) / 2;
       if(arrayOfSongs[mid].startsWith(enteredPrefix))
       {
         System.out.println("Found a match, adding to list");
         listOfMatches.add(arrayOfSongs[mid]);
       }    
    }   
    return listOfMatches;
}
一旦你有了一个匹配p的列表
可能是您想要的歌曲的嫌疑人,您可以以某种方式使用compareTo方法。

现在正在处理类似的问题。我相信伪代码会像你的一样。我创作了一首pojo类歌曲。一首歌由三根弦组成:艺术家、标题和歌词

创建歌曲对象时,您会得到:

     //     Artist             Title                     Lyrics..
歌曲a=[农夫布朗,哦'麦当劳,哦'麦当劳有一个农场,呃我哦我哦]

public class Song implements Comparable<Song> {

private String _artist;  
private String _lyrics;
private String _title;

   // constructor
   public Song(String artist, String title, String lyrics) {
   this._artist = artist;
   this._title = title;
   this._lyrics = lyrics;
   }

   public String getArtist() {
       return _artist;
   }

   public String getLyrics() {
       return _lyrics;
   }

   public String getTitle() {
       return _title;
   }

   public String toString() {
       String s = _artist + ", \"" + _title + "\"";
    return s;
   }

   //This compare two song objects
   public int compareTo(Song song) {
       String currentSong = song.toString();
       int x = currentSong.compareToIgnoreCase(this.toString());  
       return x;
   }
这是您的方法,它将接收歌曲数组和前缀,并使用比较方法查看它们是否匹配。如果它们匹配,则compareTo方法返回0。如果你得到0,那么你知道你已经找到了你的歌曲,所以返回arrayOfSongs[找到歌曲的索引]

我还没有编码我的搜索,但我修改了你的匹配我的代码。我还没有测试过。我认为你甚至不需要一个比较方法,但你可以使用它。此外,对于缩放,二进制搜索应返回可能匹配的歌曲列表,因为您可能有多首以xyz开头的歌曲。当你开始用前缀在谷歌上搜索时,你会得到一个下拉菜单dog,donut,double,这给了用户一些选择,比如搜索引擎

    public static ArrayList<Song> search (String[] arrayOfSongs , String enteredPrefix) {
     ArrayList<Song> listOfMatches = new ArrayList<Song>;
     int mid;
     int lo = 0;
     int hi = arrayOfSongs.length - 1;
     while(lo <= hi) 
     {
     mid = (hi + lo) / 2;
       if(arrayOfSongs[mid].startsWith(enteredPrefix))
       {
         System.out.println("Found a match, adding to list");
         listOfMatches.add(arrayOfSongs[mid]);
       }    
    }   
    return listOfMatches;
}

一旦你有了你想要的歌曲的可能嫌疑犯的匹配列表,你可以以某种方式使用compareTo方法。

一个例子将有助于使你的问题更容易理解。给定一组人名和前缀say bi,我希望将所有人名添加到一个数组列表中,该列表将包含整个问题,但我希望使用给定前缀rest的binarysearch i can i take Care一个示例将有助于使您的问题更容易理解。给定一组人名和前缀,请说bi,我希望将所有人名添加到包含整个问题的arraylist中,但我希望使用给定前缀rest的binarysearch查找姓名,我可以接受care@KaranSingh: 有关String.startsWith方法的信息,请参阅。有关条件运算符的完整信息,请参见:,看见但是,简而言之:如果a是真的,那么a?b:c表示b,如果a为false,则表示c。另外,我在上面的语句中得到了一个错误,类型不匹配。您能将实现更改为ifelse以便我能理解它吗better@KaranSingh当前位置你想做的事情没有真正意义。你不能将字符串实例与任意类型t的实例进行比较。我知道我的老师给我的问题是一个考试复习题。我只是想实现他让我做的事。我只在乎通过考试exam@KaranSingh:有关String.startsWith方法的信息,请参阅。有关条件运算符的完整信息,请参见:,看见但是,简而言之:如果a是真的,那么a?b:c表示b,如果a为false,则表示c。另外,我在上面的语句中得到了一个错误,类型不匹配。您能将实现更改为ifelse以便我能理解它吗better@KaranSingh当前位置你想做的事情没有真正意义。你不能将字符串实例与任意类型t的实例进行比较。我知道我的老师给我的问题是一个考试复习题。我只是想实现他让我做的事。我只在乎通过考试