2013-04-23 72 views
0

我必须通过特定键(使用二分搜索方法)找到第一个和最后一个元素。我已经完成了searchFirst方法,但我无法完成searchLast方法。有时它有时不起作用(这取决于价值即时寻找),那就是问题所在。如何通过特定键找到数组中的最后一个元素

我有一个数据类与一些属性,如时间戳,名称,产品等即时读取出一个文本文件。当我完成填充Data数组时,我使用合并排序对数组进行排序。

然后,我需要通过特定名称的数组的第一个和最后一个元素。

searchFirst方法很完美,但searchLast不会做我想做的。

下面是searchLast方法的代码(n是他应该查找的值,w此时不使用)。

public static int searchLast(Data[] array, String n, String w) { 
     int left = 0; 
     int right = array.length - 1; 
     int m = -1; 

     while (left < right) { 
      m = (left + right)/2; 
      if (array[m].getName().compareTo(n) > 0) { 
       right = m - 1; 
      } else { 
       left = m + 1; 
      } 
     } 

     if (m >= 0) { 
      if (array[right].getName().equals(n)) { 
       return right; 
      } 
     } 

     return NO_KEY; 
    } 

我无法找到的bug,也许你可以帮我......有时代码发现最后一个有时不...

+0

你能不能给我们的一个例子输入不起作用? – Keppil 2013-04-23 19:15:20

+0

我不知道我是否允许发布输入数组,但getName返回一个类似“GXA:name”的字符串; x是一个数字,例如我在寻找像“G13A:Shuffle”这样的字符串。是否有足够的信息? - 我认为它和我在整数数组中寻找特定数字的最后一个元素一样。 – XenonUnlimited 2013-04-23 19:20:12

+0

'searchFirst'和'searchLast'让我知道列表中可能有多个重复的值。而二进制搜索不处理这种情况。一旦找到它,它就完成了。它是否必须是二分查找? – 2013-04-23 19:25:28

回答

0
public static int searchLast(Data[] array, String n, String w) { 
     int left = 0; 
     int right = array.length - 1; 
     int m = -1; 
     int found = -1; 

      while (left < right) { 
       m = (left + right)/2; 
       if (array[m].getName().compareTo(n) > 0) { 
        right = m - 1; 
       } else if (array[m].getName().compareTo(n) < 0){ 
        left = m + 1; 
       } else { 
        found = m; 
        left = m + 1; 
      } 

     return found; 
    } 
+0

这看起来不错,谢谢,但它没有工作...对于第一搜索值预计15是15第二预期69是68第三预期85是84等等。你的代码工作6次...如果失败,它失败-1 – XenonUnlimited 2013-04-23 19:37:26

+0

得到了错误...而(左<右)必须是while(左<=右) – XenonUnlimited 2013-04-23 19:56:50

相关问题