【问题标题】:Sorting of files according to file or folder根据文件或文件夹对文件进行排序
【发布时间】:2015-10-23 05:53:09
【问题描述】:

我有一个包含多个文件和文件夹的名称数组...现在我想根据文件和文件夹对名称进行排序。首先显示所有文件夹,然后显示所有文件。我有变量来检查是否在特定数组的索引是文件或文件夹。但无法思考逻辑.. 我附上了我的一些代码。

//////////////////////////// case 0://按名称排序 {

                        if(m_sortType == SORT_BY_NAME && temp==false)
                        {
                            m_sortType = SORT_BY_NAME;
                            m_sortOrder=SORT_ORDER_DESCENDING;
                            temp= true;
                            //Log.d("SORTING", "SORT - NAME - DES");
                        }
                        else
                        {
                            m_sortType = SORT_BY_NAME;
                            m_sortOrder=SORT_ORDER_ASCENDING;
                            temp=false;
                            //Log.d("SORTING", "SORT - NAME - AES");
                        }

                        //Log.d("SORTING", "Data bfore sort");
                        for (int k=0; k<m_adapter.m_env.m_count; k++)
                            //Log.d("SORTING DATA", k + ": " + m_adapter.m_env.m_fs.get(m_SortArray[k]).m_name);

                        m_adapter.sortListing(m_sortType,m_sortOrder);

                        //Log.d("SORTING", "Data after sort");
                        for (int k=0; k<m_adapter.m_env.m_count; k++)
                            //Log.d("SORTING DATA", k + ": " + m_adapter.m_env.m_fs.get(m_SortArray[k]).m_name);

                        //Refresh();
                        break;
                    }

/////////////// 私人无效排序列表(int sortType,int sortOrder) { m_sortType = 排序类型; m_sortOrder = 排序顺序; Arrays.sort( m_SortArray , new Comparator() {

            public int compare(Integer a1, Integer a2)
            {

                if(m_sortType == SORT_BY_NAME)
                {
                    String s1 = null,s2 = null;
                    FileFolderEnum t2 = null;
                    FileFolderEnum t1 = null;
                    int i;
                    if(m_sortOrder==SORT_ORDER_ASCENDING)
                    {
                        s1 = m_env.m_fs.get(a1).m_name;
                        s2 = m_env.m_fs.get(a2).m_name;
                        t1 = m_env.m_fs.get(a1).m_type;
                        t2 = m_env.m_fs.get(a2).m_type;
                    }
                    else if(m_sortOrder==SORT_ORDER_DESCENDING)
                    {
                        s1 = m_env.m_fs.get(a2).m_name;
                        s2 = m_env.m_fs.get(a1).m_name;
                        t1 = m_env.m_fs.get(a2).m_type;
                        t2 = m_env.m_fs.get(a1).m_type;
                    }
                    //Log.d("SORTING COMPARE", "(" + Integer.toString(a1)+") s1: " + s1);
                    //Log.d("SORTING COMPARE", "(" + Integer.toString(a2)+") s2: " + s2);
                    if((t1.equals(CFileFolder.FileFolderEnum.FFE_FOLDER)&&(t2.equals(CFileFolder.FileFolderEnum.FFE_FOLDER))))
                    {
                         i=s1.compareToIgnoreCase (s2);
                    }
                     i=s1.compareToIgnoreCase (s2);

                    //Log.d("SORTING COMPARE", "s1.compareTo(s2): " + Integer.toString(i));
                    return i;
                }

//////////////////

【问题讨论】:

    标签: android


    【解决方案1】:

    我从自己的文件浏览器中提取的代码。随心所欲地使用。 :

    File[] directoryList = currentFolder.listFiles(); 
    if (directoryList != null) {
       List<File> directoryListing = new ArrayList<File>();
       directoryListing.addAll(Arrays.asList(directoryList));
       Collections.sort(directoryListing, new SortFileName());
       Collections.sort(directoryListing, new SortFolder());
    }
    
    
    //sorts based on the files name
    public class SortFileName implements Comparator<File> {
        @Override
        public int compare(File f1, File f2) {
              return f1.getName().compareTo(f2.getName());
        }
    }
    
    //sorts based on a file or folder. folders will be listed first
    public class SortFolder implements Comparator<File> {
        @Override
        public int compare(File f1, File f2) {
             if (f1.isDirectory() == f2.isDirectory())
                return 0;
             else if (f1.isDirectory() && !f2.isDirectory())
                return -1;
             else
                return 1;
              }
    }
    

    【讨论】:

    • (f1.isDirectory() && f2.isDirectory()) || (!f1.isDirectory() && !f2.isDirectory()) 可以简化为 (f1.isDirectory() == f2.isDirectory)
    • 非常感谢,真的治愈了我很多。 @dymmeh
    • 为什么要将directoryList数组转换为List&lt;File&gt;,而不是使用Arrays.sort(directoryList, ...)
    【解决方案2】:

    我知道这是一个旧帖子,但我需要解决这个问题并遇到了这个帖子。 dymmeh 的解决方案是一个好的开始,但我想一次性排序,并且我想要类似 Windows 的排序(不考虑情况)。这是我想出的:

    import java.io.File;
    import java.util.Comparator;
    
    public class FileComparator implements Comparator<File> {
        @Override
        public int compare(File lhs, File rhs) {
    
            if (lhs.isDirectory() == rhs.isDirectory()) { // Both files are directory OR file, compare by name
                return lhs.getName().toLowerCase().compareTo(rhs.getName().toLowerCase());
            } else if (lhs.isDirectory()) { // Directories before files
                return -1;
            } else { // rhs must be a directory
                return 1;
            }
        }
    }
    

    用法很简单:

    final File file = new File(_directory);
    final File[] files = file.listFiles();
    Arrays.sort(files, new FileComparator());
    

    【讨论】:

      【解决方案3】:

      你有变量来检查文件和文件夹的名称,我可以想办法根据你的要求对它们进行排序。制作两个 ArrayList。将这两个 ArrayList 中的文件夹和文件分开,然后根据名称对它们进行排序,对字符串进行简单的排序操作。然后只需将文件列表附加到文件夹列表的末尾。也许它会起作用。看起来很简单。

      【讨论】:

        猜你喜欢
        • 2017-08-14
        • 2014-06-08
        • 2020-04-19
        • 1970-01-01
        • 2020-04-01
        • 1970-01-01
        • 2013-02-10
        • 2017-07-18
        • 1970-01-01
        相关资源
        最近更新 更多