【问题标题】:Finding the first element that starts with a specified String in a sorted String array in Java在Java中的排序字符串数组中查找以指定字符串开头的第一个元素
【发布时间】:2012-10-11 10:30:49
【问题描述】:

我在 Java 中有一个已排序的字符串数组。我试图在该数组中找到以用户指定的字符串开头的第一个元素。我一开始以为是二分查找,但它找到的是相等的字符串,而不是以用户指定的字符串开头的字符串。我应该如何修改二进制搜索,以便我可以实现我想做的事情?

【问题讨论】:

  • 是的,搜索可以/应该是二进制的。向我们展示您的代码,有时搜索“范围”有点复杂
  • 我在标准库中使用 Arrays.binarySearch() 方法。

标签: java algorithm search binary-search


【解决方案1】:

如果元素不存在,二分搜索可以找到“小于所需元素的最后一个元素”(有时称为“应该插入它的索引”)。

通过使用此功能进行二进制搜索,您可以找到一个元素并检查:

  1. 如果它是确切的元素 - 那么它就是数组中带有此前缀的第一个元素,因为它是带有此前缀的“最小”元素,您就完成了。
  2. 如果不是同一个元素 - 通过增加一个 - 你会得到“比所需元素大的最小元素”。此元素是数组中带有此前缀的第一个元素(如果数组有前缀)。

这个功能很常见——例如它存在于java的Arrays.binarySearch()中。来自 javadocs:

返回:搜索键的索引,如果它包含在数组中;否则, (-(插入点) - 1)。插入点定义为点 键将被插入到数组中的位置: 第一个大于键的元素

从刚刚找到的索引中,很容易找到想要的元素。

代码快照:

String[] arr = { "aa" , "bb","c", "cc" , "ccc", "cccc", "ddD" };
int idx = Arrays.binarySearch(arr, "c");
if (idx < 0) 
    System.out.println(arr[-1 * idx - 1]);
else System.out.println(arr[idx]);

【讨论】:

  • 我不知道 Arrays.binarySearch() 可以做到这一点。谢谢你这么详细的回答。
  • @ipman 注意我在原始代码快照中有一个小问题(+1 而不是-1)现在修复了它。
猜你喜欢
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 2016-07-31
  • 2017-09-22
  • 2022-11-17
  • 2019-10-29
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多