如何用java输出排序后的文件



我有一个问题,我想扫描某个文件夹中的文件并输出它们。唯一的问题是输出是:(1.jpg,10.jpg,11.jpg,12.jpg,…,19.jpg,2.jpg(,而我希望它是:(1.jpg,2.jpg等等(。由于我使用:File actual = new File(i.);(I是循环重复的次数(来扫描图像,我不知道如何对输出进行排序。

这是我现在的代码。

//variables
String htmlHeader = ("<!DOCTYPE html>:n"
+ "<html lang="en">n"
+ "<head>n"
+ "<meta charset="UTF-8">n"
+ "<meta http-equiv="X-UA-Compatible" content="IE=edge">n"
+ "<meta name="viewport" content="width=device-width, initial-scale=1.0">n"
+ "<title>Document</title>n"
+ "</head>"
+ "<body>;n");
String mangaName = ("THREE DAYS OF HAPPINESS");
String htmlEnd = ("</body>n</html>");
String image = ("image-");
//ask for page number
Scanner scan = new Scanner(System.in);
System.out.print("enter a chapter number: ");
int n = scan.nextInt();

//create file for chapter
File creator = new File("manga.html");
//for loop
for (int i = 1; i <= n; ++i) {
//writing to HTML file
BufferedWriter bw = null;
bw = new BufferedWriter(new FileWriter("manga"+i+".html"));
bw.write(htmlHeader);
bw.write("<h2><center>" + mangaName + "</center></h2</br>");
//scaning files                
File actual = new File("Three Days Of Happiness Chapter "+i+" - Manganelo_files.");
for (File f : actual.listFiles()) {
String pageName = f.getName();
//create list
List<String> list = Arrays.asList(pageName);
list.sort(Comparator.nullsFirst(Comparator.comparing(String::length).thenComparing(Comparator.naturalOrder())));  
System.out.println("list");
//for loop
//writing bpdy to html file

bw.write("<p><center><img src="Three Days Of Happiness Chapter "+i+" - Manganelo_files/" + pageName + "" <br/></p>n");

System.out.println(pageName);
}
bw.write(htmlEnd);
bw.close();
System.out.println("Process Finished");
}}
}```

当您尝试对名称进行排序时,您肯定会注意到它们是按字母数字排序的(例如,将9与12进行比较;12会在9之前,因为最左边的数字1<9(。

解决这一问题的一种方法是在命名&存储您的文件。

例如,在对图片进行排序时,这对我来说一直很有效。我对所有日期都使用YYYY-MM-DD,无论日期是一位数字(例如9(还是两位数字(11(。这意味着我总是把9打成09。这也意味着给定文件夹中的每个文件名都具有相同的长度,并且每个数字(当与任何其他相邻文件的对应数字进行比较时(都会得到正确的比较。

解决这个问题的一个方法是做同样的事情,在文件名的左边加零,这样就可以很容易地根据操作系统和Java程序对它们进行排序。此解决方案的缺点是,您需要预先决定要存储在给定文件夹中的最大文件数,方法是正确设置位数(例如,3位数意味着最多1000个唯一和线性编号的文件名,从000到999(。然而,好处是,这将为您省去对编号不均匀的文件进行排序的麻烦,同时使您的文件可以预先排序一次,并随时可以快速读取。

通常,文件系统对目录中的文件没有顺序。相反,任何列出文件的内容(无论是命令行上的lsdir命令、在java代码中调用Files.list,还是打开Finder或Explorer(都将应用排序顺序。

一种常见的排序顺序是"字母数字"。在这种情况下,您描述的顺序是正确的:21之后,也在10之后。你不能挥动魔杖,告诉操作系统或文件系统驱动程序不要这样做;文件通常不具有"ordering"属性。

相反,在按字母数字排序时,使文件名按您想要的方式进行排序。因此,第一个文件的正确名称将是01.jpg。甚至可能是0001.jpg——不幸的是,在开始之前,你必须打电话告知你将使用的位数。

String.format("%05d", 1)变成了"00001"——这在这里非常有用。

同样的原理也适用于读取文件——你不能仅仅依靠操作系统为你排序。相反,将其全部读取到例如某个排序的列表中,然后对进行排序。你必须写一个相当时髦的排序顺序:找到点,去掉左边,检查它是否是一个数字,等等。相当复杂。如果"input"已经正确地以零为前缀,那么它会简单得多,那么您可以自然地对它们进行排序,而不必编写复杂的比较器。

这种比较可能应该是模态的。比较器的工作原理是交给两个元素,你必须说哪一个是"较早的",并且你必须是一致的(如果a在b之前,稍后我问你:那么,b和a怎么样,你必须指出b在a之后(。

因此,一个算法看起来像:

  • 确定a是否为数字(找到点,从开始到点解析子字符串(
  • 确定b是否为数字
  • 如果两者都是数字,请检查这些数字的顺序。如果他们有订单(即不相同(,则返回答案。否则,比较点之后的内容(1.jpg应该在1.png之前排序(
  • 如果两者都不是数字,只需比较字母数字(aName.compareTo(bName)(
  • 如果一个是数字,而另一个不是,则数字总是获胜,反之亦然

最新更新