2014-02-11 26 views
0

我在編譯一些我編寫的代碼時遇到了麻煩。該代碼旨在對目錄數組進行排序,然後返回已排序的數組。傳遞到程序的陣列是這樣的:{"/","/usr/","/usr/local/","/usr/local/bin/","/games/","/games/snake/","/homework/","/temp/downloads/"}Java嵌入式比較器類

這樣做的有序的答案是:

{ "/", "/games/", "/homework/", "/usr/", "/games/snake/", 
    "/temp/downloads/", "/usr/local/", "/usr/local/bin/" } 

所以基本上,這是最深刻的首先被放置的目錄。如果兩個目錄具有相同的深度,我們根據第一個字母按字母順序排序。 到目前爲止我的代碼是這樣的:

import java.util.Arrays; 
import java.util.Comparator; 

public class Dirsort { 

    class APTComp implements Comparator<String> { 

     public int compare(String a, String b) { 
      String[] d1 = a.split("/"); 
      String[] d2 = b.split("/"); 
      int diff = d1.length - d2.length; 

      if (diff != 0) { 
      return diff; 
      } //{"/","/usr/","/usr/local/","/usr/local/bin/","/games/","/games/snake/","/homework/","/temp/downloads/"} 

      return a.compareTo(b); 
     } 



     public String[] sort(String[] dirs) { 
     Arrays.sort(dirs); 
     return dirs; 
     } 
} 

你們能告訴我什麼,你錯在這裏找到?我的Arrays.sort()調用是否使用我的修改比較方法?

非常感謝, 朱奈德

回答

2

默認情況下,Arrays.sort()方法使用自然順序進行排序。由於您的案例中的數組是String,因此默認情況下它將根據字符串的字母順序進行排序。

爲了得到你想要的結果,你將不得不自定義比較實現的實例傳遞給Arrays.sort()。

這種替換APTComp類的public String[] sort(String[] dirs)方法:

public String[] sort(String[] dirs) 
{ 
    Arrays.sort(dirs, new APTComp()); 
    return dirs; 
} 
+0

嗨。所以我再次運行它,目前,代碼只是按字母順序排序,而不是目錄的深度。目錄的深度應該是用於排序數組的第一個標準。比較方法有問題嗎? – user2904796

+0

您的比較器方法實現看起來不錯。以上方法給我正確的結果。它給人的合成陣列是 / /遊戲/ /功課/ 在/ usr/ /遊戲/蛇/ /溫度/下載/ 在/ usr /本地/ 在/ usr/local/bin目錄/ –

0

Arrays.sort不排序的比較直接,除了你打電話。你應該使用

Arrays.sort(dirs, new APTComp()); 

修改後的代碼:

import java.util.Arrays; 
import java.util.Comparator; 

public class Main { 

    class APTComp implements Comparator<String> { 

     public int compare(String a, String b) { 
      String[] d1 = a.split("/"); 
      String[] d2 = b.split("/"); 
      int diff = d1.length - d2.length; 

      if (diff != 0) { 
      return diff; 
      } //{"/","/usr/","/usr/local/","/usr/local/bin/","/games/","/games/snake/","/homework/","/temp/downloads/"} 

      return a.compareTo(b); 
     } 
    } 


     public String[] sort(String[] dirs) { 
     Arrays.sort(dirs, new APTComp()); 
     return dirs; 
     } 

     public static void main(String[] args) { 
      Main main = new Main(); 
      String[] result = main.sort(new String[] {"/","/usr/","/usr/local/","/usr/local/bin/","/games/","/games/snake/","/homework/","/temp/downloads/"}); 
      for(int i=0; i<result.length; i++) { 
      System.out.println(i + ": " + result[i]); 
      } 
     } 
} 

結果: 0:/ 1:/遊戲/ 2:/功課/ 3:在/ usr/ 4:/遊戲/蛇/ 5:/溫度/下載/ 6:在/ usr /本地/ 7:在/ usr/local/bin中/

參見another example

+0

嗨。我做了你所建議的改變。但它仍然說代碼中存在解析錯誤。 – user2904796

+0

修改後的代碼已添加。 –

+0

嗨。所以我再次運行它,目前,代碼只是按字母順序排序,而不是目錄的深度。目錄的深度應該是用於排序數組的第一個標準。比較方法有問題嗎? – user2904796

0

此代碼的工作,請檢查

import java.util.Arrays; 
import java.util.Comparator; 

public class Dirsort { 

class APTComp implements Comparator<String> { 

    public int compare(String a, String b) { 
     String[] d1 = a.split("/"); 
     String[] d2 = b.split("/"); 
     int diff = d1.length - d2.length; 
     if (diff != 0) { 
      return diff; 
     } 
     return a.compareTo(b); 
    } 

    public String[] sort(String[] dirs) { 
     Arrays.sort(dirs); 
     return dirs; 
    } 
} 

public static void main (String[] args) { 
    String[] arr = new String[] {"/","/usr/","/usr/local/","/usr/local/bin/","/games/","/games/snake/","/homework/","/temp/downloads/"}; 
Dirsort ds = new Dirsort(); 
    Arrays.sort(arr, ds.new APTComp()); 
    for (String s : arr) { 
     System.out.println(s); 
    } 
} 
} 

OUTPUT:
/
/遊戲/
/功課/
在/ usr/
/遊戲/蛇/
/溫度/下載/
/usr/local/
/usr/local/bin/

+0

你好。代碼正在工作,但它沒有按照它應該的方式排序。這些目錄應該先按深度排序,然後如果有兩個相同深度的目錄,則應按字母順序排序。 – user2904796

+0

哦,對不起,我只是誤解了,現在我編輯了代碼。請檢查 –