对于对象的二进制搜索,我将返回什么?

时间:2018-12-02 22:39:46

标签: java

public Song searchSongByName (String name) {
  // ADD YOUR CODE HERE
  int low = 0;
  int high = items.length - 1;
  String foundName = "";
  while ( low <= high ) {
    int mid = (high + low) / 2;
    if ( items[mid].getName().compareTo(name) == 0) {
      foundName+= name;;
    } else {

      if ( items[mid].getName().compareTo(name) == -1 ) {
        low = mid;
      } else {
        high = mid;
      }
    }
  }

}

这是我正在研究的项目,基本上,“项目”是歌曲的对象数组,我需要搜索该数组以查找参数中给出的歌曲。我的第一个想法是只返回我创建的字符串“ foundName”,但没有成功。然后我想到了返回-1(如果找不到)和0(如果找到),但是返回类型是Song。那么,我可以返回什么让用户知道找到了他们的歌曲呢?

3 个答案:

答案 0 :(得分:3)

我认为这些东西就是这样

Song[] items = ...

因此,如果找到,则应返回此值

// instead of line // foundName+= name;;
return items[mid];

如果未找到,则在while循环后返回null

但是,如果您可以更改方法的返回类型,则应该返回Optional

// instead of line // foundName+= name;;
return Optional.of(items[mid]);

在这种情况下,如果找不到,请返回Optional.empty()

答案 1 :(得分:3)

一种解决方案是使用Java 8流来实现:

// written to return null if song name not found
public static Song searchSong(String name) {        
    return Arrays.stream(items)
            .filter(e -> e.getName().equalsIgnoreCase(name))
}

根据Makoto的评论进行了改进


代码故障:

// convert items array into a Stream using java.util.Arrays
Arrays.stream(items)

    // filter the Stream to get only Songs whose name match the name String (ignoring case)
    .filter(e -> e.getName().equalsIgnoreCase(name))

    // find the first item in the filtered Stream
    .findFirst()

    // return this item or null, if nothing found
    .orElse(null);

答案 2 :(得分:1)

二进制搜索返回在对象数组中找到元素的索引。它不会返回元素本身。

因此,二进制搜索方法的返回类型应为int

例如,要稍后获取对象本身,可以执行以下操作:

int index = binarySearch("Never Gonna Give You Up");
if (index > -1)
  Song rickAstleySong = items[index];