2013-06-03 33 views
2

一個字符串數組考慮下面的字符串數組,這是文件名使用相對路徑列表:排序包含相對文件名

String[] myArray = { "src\\kop\\cKOP_C.o" 
        , "src\\io\\cIO_S.o" 
        , "src\\io\\com\\cGA_M.o" 
        , "src\\io\\cADC.o" 
        , "src\\io\\cIO_H.o" 
        , "src\\io\\com\\com_m.o" 
        , "src\\io\\tab_s.o" 
        , "src\\kop\\cKOP" }; 

的目錄佈局是:

src\io\cADC.o 
src\io\cIO_H.o 
src\io\cIO_S.o 
src\io\tab_s.o 
src\io\com\cGA_M.o 
src\io\com\com_m.o 
src\kop\cKOP_A.o 
src\kop\cKOP_B.o 

我想排序這個數組在Java中有這樣的結果:

src\\io\\cADC.o 
src\\io\\cIO_H.o 
src\\io\\cIO_S.o 
src\\io\\tab_s.o 
src\\io\\com\\cGA_M.o 
src\\io\\com\\com_m.o 
src\\kop\\cKOP_A.o 
src\\kop\\cKOP_B.o 

目前我使用的Array.Sort(myarray的),但日Ë結果是這樣的:

src\\io\\cADC.o 
src\\io\\cIO_H.o 
src\\io\\cIO_S.o 
src\\io\\com\\cGA_M.o 
src\\io\\com\\com_m.o 
src\\io\\tab_s.o 
src\\kop\\cKOP_A.o 
src\\kop\\cKOP_B.o 

這不是我想要的,因爲我想keep目錄信息,所以名單目錄中的第一所有文件,如果有一個子目錄中,列出了文件在子目錄之後。

我知道我必須實現一個比較器()的數組進行排序,因爲我想要的,但我無法弄清楚比較的邏輯。

+5

使用['陣列#排序(T [],比較) '](http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort%28T [],%20java.util.Comparator%29)並提供一個'C omparator '支持你想要/需要的東西。爲了簡化比較,您可以創建一個'File []'數組並使用'Comparator ',注意['File'](http://docs.oracle.com/javase/7/docs/api/java/ io/File.html)類有更多的方法來支持你的排序比較器,比如'isFile'和'isDirectory'。 –

+2

那些是相對的,而不是絕對的路徑。

+0

@Ernest:你完全正確的絕對路徑:)。 – user2448122

回答

2

我的解決辦法:

Arrays.sort(myArray,new Comparator<String>() 
    { 
     public int compare(String a,String b) 
     { 
      if(a.equals(b)) // same path/filename 
       return 0; 
      int aBSCount = a.replaceAll("[^\\\\]","").length(); 
      int bBSCount = b.replaceAll("[^\\\\]","").length(); 

      if(aBSCount==bBSCount) // same directory depth 
       return a.compareTo(b); 

      String[] aSplit = a.split("\\\\"); 
      String[] bSplit = b.split("\\\\"); 

      int shortest = Math.min(aSplit.length, bSplit.length); 

      for(int x = 0;x < shortest;x++) 
      { 
       if(x==shortest-1) 
        return aBSCount < bBSCount ? -1 : 1; 

       if(!(aSplit[x].equals(bSplit[x]))) 
        return aSplit[x].compareTo(bSplit[x]); 
      } 

      return aBSCount < bBSCount ? -1 : 1; 
     } 
    }); 
+0

這也工作得很好! – user2448122

0

你只需要實現sort

Arrays.sort(myArray, new Comparator<String>() { 
     @Override 
     public int compare(String arg0, String arg1) { 
      arg0 = arg0.toLowerCase(); 
      arg1 = arg1.toLowerCase(); 
      return arg0.compareTo(arg1); 
     } 
    }); 
+0

這就像原來的Array.sort(myArray);'。 – user2448122

0

試試這個

Arrays.sort(a, new Comparator<String>() { 
     public int compare(String o1, String o2) { 
      File f1 = new File(o1); 
      File f2 = new File(o2); 
      int c1 = f1.getParent().compareTo(f2.getParent()); 
      if (c1 > 0) { 
       return 1; 
      } 
      if (c1 < 0) { 
       return -1; 
      } 
      return f1.getName().compareTo(f2.getName()); 
     } 
+0

這工作正常!我不得不微調這一點,因爲在當前文件夾中有文件,對於那些'.getParent()'爲空的文件。 – user2448122

相關問題