2013-04-23 74 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

相關問題