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的,因为我要目录信息,所以先列出一个目录内的所有文件,如果里面有子目录,再列出子目录下的文件。

我知道我必须实现一个 Comparator() 才能按照我的意愿对数组进行排序,但我无法弄清楚比较背后的逻辑。

4

3 回答 3

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;
        }
    });
于 2013-06-03T15:10:14.340 回答
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);
        }
    });
于 2013-06-03T14:41:34.750 回答
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());
        }
于 2013-06-03T14:42:49.347 回答