当前位置: 首页 > 面试题库 >

如何以升序排列文件名?

翟黎明
2023-03-14
问题内容

我在文件夹中有一组文件,所有文件都以相似的名称开头,除了一个。这是一个例子:

Coordinate.txt
Spectrum_1.txt
Spectrum_2.txt
Spectrum_3.txt
.
.
.
Spectrum_11235

我可以列出指定文件夹中的所有文件,但是列表的排列顺序不是频谱编号的升序。示例:执行程序时得到以下结果:

Spectrum_999.txt
Spectrum_9990.txt
Spectrum_9991.txt
Spectrum_9992.txt
Spectrum_9993.txt
Spectrum_9994.txt
Spectrum_9995.txt
Spectrum_9996.txt
Spectrum_9997.txt
Spectrum_9998.txt
Spectrum_9999.txt

但是这个顺序是不正确的。在Spectrum_999.txt之后应该有Spectrum_1000.txt文件。有人可以帮忙吗?这是代码:

import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

    public class FileInput {

        public void userInput()
        {
            Scanner scanner = new Scanner( System.in );
            System.out.println("Enter the file path: ");
            String dirPath = scanner.nextLine(); // Takes the directory path as the user input

            File folder = new File(dirPath);
            if(folder.isDirectory())
            {
                File[] fileList = folder.listFiles();

                Arrays.sort(fileList);

                System.out.println("\nTotal number of items present in the directory: " + fileList.length );


                // Lists only files since we have applied file filter
                for(File file:fileList)
                {
                    System.out.println(file.getName());
                }

                // Creating a filter to return only files.
                FileFilter fileFilter = new FileFilter()
                {
                    @Override
                    public boolean accept(File file) {
                        return !file.isDirectory();
                    }
                };

                fileList = folder.listFiles(fileFilter);

                // Sort files by name
                Arrays.sort(fileList, new Comparator()
                {
                    @Override
                    public int compare(Object f1, Object f2) {
                        return ((File) f1).getName().compareTo(((File) f2).getName());
                    }
                });

                //Prints the files in file name ascending order
                for(File file:fileList)
                {
                    System.out.println(file.getName());
                }

            }   
        }
    }

问题答案:

您要的是数字排序。您需要实现一个Comparator并将其传递给Arrays#sort方法。在compare方法中,您需要从每个文件名中提取数字,然后比较数字。

之所以得到现在得到的输出,是因为排序按字母数字顺序进行

这是一种非常基本的方法。此代码使用简单的String操作来提取数字。如果您知道文件名的格式,则此方法有效Spectrum_<number>.txt。一种更好的提取方法是使用正则表达式。

public class FileNameNumericSort {

    private final static File[] files = {
        new File("Spectrum_1.txt"),
        new File("Spectrum_14.txt"),
        new File("Spectrum_2.txt"),
        new File("Spectrum_7.txt"),     
        new File("Spectrum_1000.txt"), 
        new File("Spectrum_999.txt"), 
        new File("Spectrum_9990.txt"), 
        new File("Spectrum_9991.txt"), 
    };

    @Test
    public void sortByNumber() {
        Arrays.sort(files, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                int n1 = extractNumber(o1.getName());
                int n2 = extractNumber(o2.getName());
                return n1 - n2;
            }

            private int extractNumber(String name) {
                int i = 0;
                try {
                    int s = name.indexOf('_')+1;
                    int e = name.lastIndexOf('.');
                    String number = name.substring(s, e);
                    i = Integer.parseInt(number);
                } catch(Exception e) {
                    i = 0; // if filename does not match the format
                           // then default to 0
                }
                return i;
            }
        });

        for(File f : files) {
            System.out.println(f.getName());
        }
    }
}

输出量

Spectrum_1.txt
Spectrum_2.txt
Spectrum_7.txt
Spectrum_14.txt
Spectrum_999.txt
Spectrum_1000.txt
Spectrum_9990.txt
Spectrum_9991.txt


 类似资料:
  • 问题内容: 我有一个包含jpg和其他文件的目录,所有jpg的文件名中都带有数字。有些文件名中可能包含其他字符串。 例如。 或者可能是 在Python中,我需要按升序排列所有jpg的列表。这是此代码段 我得到的是这个 显然,它首先盲目地排序最高有效数字。我试过使用,因为您可以看到它希望能够解决该问题,但没有区别。 问题答案: 假设每个文件名中只有一个数字: 这个版本也可以在Python 3中使用:

  • 我想按T1和T3升序对以下三元组列表进行排序: first:按第一个元组(long)升序排序 如果有相同数量的条目(long),则按字母顺序升序排列最后一个元组(最后一个字符串) 可能的排序输出: 123123,xxx,zz 使用此代码,a可以按第一个元组(long)对列表排序,但不能按最后一个元组(last string)排序:

  • 我有98000个美国家庭街道地址,我需要按照“步行”的顺序进行排序,也就是说,按照你要走的顺序,沿着街道的一侧走,然后穿过街道往回走。 所需的df结果,对奇数街道编号进行升序排序,然后对偶数街道编号切换到降序排序。[抱歉,第一个问题,还没有资格复制Jupyter笔记本的图像] 4列:数字、街道、城镇、偶数 “编号”列的预期结果:1231 1233 1235 1237 1239 1238 1236

  • 这里,我试图在之后按排序列表,我有一个列表,其中在即处有的数据,在即处有的数据。 现在,我想要的是基于该按排序列表。为此,我使用了 感谢任何帮助。谢谢 下面是我所做的排序

  • 问题内容: 嗨,我正在尝试读取未排序的文件,并让Java对CSV数据文件的一列进行排序,并将这些结果打印到新文件中。我在此网站上搜索时借用了该解决方案,因为我认为这对我想要完成的工作非常理想。我有282行数据,形式为 这是在csv文件中。当我使用上面的代码时,它在sorted_marks.txt中只给我一行,就像这样 我相信它甚至都没有排序。 我希望将新文件中的所有结果根据其用户ID排序,但没有别

  • 我在学校的任务是创建一个程序,以升序排列数组的值。它几乎就在那里,但每当我输入“44 55 66 22 33 11 77 99 88 66”或它输出的任何数字 -858993460,11,22,33,44,55,66,66,77,88,或开头为负数 第一个数字到底怎么了?我是不是缺了什么? 我对C++很陌生,我不太明白这里的问题。如果有什么建议我可以用请告诉他们。 }