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。那么,我可以返回什么让用户知道找到了他们的歌曲呢?
答案 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];