1

我有一个文件和目录列表,但列表中没有组织。我想用首先按字母顺序列出的目录对它们进行排序,然后是文件。我怎样才能做到这一点?

private void fill(File[] files) {
        this.directoryEntries.clear();

        // and the ".." == 'Up one level'
        if(this.currentDirectory.getParent() != null && !this.currentDirectory.equals("/sd card"))
                this.directoryEntries.add(new IconifiedText(
                                getString(R.string.up_one_level),
                                getResources().getDrawable(R.drawable.uponelevel)));

        Drawable currentIcon = null;
        for (File current_File : files){
                if (current_File.isDirectory()) {
                        currentIcon = getResources().getDrawable(R.drawable.folder);
                }else{
                        String fileName = current_File.getName();
                        /* Determine the Icon to be used,
                         * depending on the FileEndings defined in:
                         * res/values/fileendings.xml. */
                        if(checkEndsWithInStringArray(fileName, getResources().
                                getStringArray(R.array.fileEndingJs))){
                                currentIcon = getResources().getDrawable(R.drawable.mimejs);
                        }else if(checkEndsWithInStringArray(fileName, getResources().
                                getStringArray(R.array.fileEndingHTML))){
                                currentIcon = getResources().getDrawable(R.drawable.mimehtml);
                        }else if(checkEndsWithInStringArray(fileName, getResources().
                                getStringArray(R.array.fileEndingCSS))){
                                currentIcon = getResources().getDrawable(R.drawable.mimecss);
                        }else if(checkEndsWithInStringArray(fileName, getResources().
                                getStringArray(R.array.fileEndingXML))){
                                currentIcon = getResources().getDrawable(R.drawable.mimexml);
                        }else if(checkEndsWithInStringArray(fileName, getResources().
                                getStringArray(R.array.fileEndingPhp))){
                            currentIcon = getResources().getDrawable(R.drawable.mimephp);
                    }else{
                            currentIcon = getResources().getDrawable(R.drawable.mimetxt);
                        }                              
                }
                switch (this.displayMode) {
                        case ABSOLUTE:
                                /* On absolute Mode, we show the full path */
                                this.directoryEntries.add(new IconifiedText(current_File
                                                .getPath(), currentIcon));
                                break;
                        case RELATIVE:
                                /* On relative Mode, we have to cut the
                                 * current-path at the beginning */
                                int currentPathStringLenght = this.currentDirectory.getAbsolutePath().length();
                                this.directoryEntries.add(new IconifiedText(
                                                current_File.getAbsolutePath().
                                                substring(currentPathStringLenght),
                                                currentIcon));

                                break;
                }
        }
        Collections.sort(this.directoryEntries);

        itla.setListItems(this.directoryEntries);              
        this.setListAdapter(itla);
}
4

1 回答 1

4

编写一个按以下方式排序的比较器isDirectory()

class FileTypeComparator implements Comparator<File> {

    @Override
    public int compare(File file1, File file2) {

        if (file1.isDirectory() && file2.isFile())
            return -1;
        if (file1.isDirectory() && file2.isDirectory()) {
            return 0;
        }
        if (file1.isFile() && file2.isFile()) {
            return 0;
        }
        return 1;
    }
}

另一个按getName()

class FileNameComparator implements Comparator<File> {

    @Override
    public int compare(File file1, File file2) {

        return String.CASE_INSENSITIVE_ORDER.compare(file1.getName(),
                file2.getName());
    }
}

然后使用 Guavas Ordering.compound(Comparator compare2)将两者结合起来Comparators

Collections.sort(files,Ordering.from(new FileTypeComparator()).compound(new FileNameComparator()));
于 2013-03-28T06:43:41.413 回答