文件智能排序(根据文件名称中的数字编号排序)

您所在的位置:网站首页 怎么按照名称排序 文件智能排序(根据文件名称中的数字编号排序)

文件智能排序(根据文件名称中的数字编号排序)

2024-06-15 02:28| 来源: 网络整理| 查看: 265

最近需要编写一个将一系列图片合并为一个webp动图的程序,遇到了一个文件排序的问题。

文件排序问题:

1.按照文件大小排序

2.按照文件修改时间排序

3.按照文件名称排序

这些排序操作都很简单,编程实现也很容易。

但是对于第3种排序,即按照文件名称排序,理解上其实存在一些歧义。

例如对于以下文件序列:

a10.txt file9.txt a9.txt file8.txt a8.txt file11.txt file7.txt file10.txt a11.txt

可以给出以下两种文件名称排序结果:

a8.txt a9.txt a10.txt a11.txt file7.txt file8.txt file9.txt file10.txt file11.txt a10.txt a11.txt a8.txt a9.txt file10.txt file11.txt file7.txt file8.txt file9.txt

第二种结果很好理解,文件名按照字符的字典顺序进行排序,编程实现起来很简单。而第一种结果中,则提取了文件名中的数字,对数字部分按照数字大小来排序,其他字符部分按照字典序排序。

当文件名中的数字位数一致,即短位数用0补齐的情况下,两种排序方式是一致的,但是当文件名中的数字位数不一致时,两种排序的结果则有差异,在实际场景中,我们往往需要的是第一种结果。

第一种结果的排序方式如何编程实现呢?仔细一想,还有些麻烦,上例中,文件名只存在一个数字,如果文件名中存在多组数字呢,例如:

file9_9.txt file9_10.txt file9_11.txt file10_9.txt file10_10.txt file10_11.txt

实现方式:

将文件名称按照普通字符、数字串拆分为一个字符串数组,在对两个文件名进行排序时,依次对比它们的字符串数组中的每一项,如果两者都是普通字符,则按照普通字符比较,如果两者都是数字串,则按照数字大小比较,否则认为数字串小于普通字符串,空字符串小于数组字符串。

编码实现:

两个类:

FileNameEntry.class:文件名中的一个字串,要么是一个不包含数字的普通字符串,要么是一个纯数字字符串。

FileName.class:FileNameEntry的集合。

package com.dancen.util.filesort; import java.util.ArrayList; import java.util.List; import com.dancen.util.MyStringUtil; /** * * @author dancen * */ public class FileNameEntry implements Comparable { private String text; private long number; public static void main(String[] args) { List entries = createFileNameEntries("a1"); for(FileNameEntry entry : entries) { System.out.println(entry); } } public static List createFileNameEntries(String fileName) { List rs = null; if(null != fileName) { rs = new ArrayList(); StringBuilder textStringBuilder = new StringBuilder(); StringBuilder numberStringBuilder = new StringBuilder(); for(char c : fileName.toCharArray()) { if(Character.isDigit(c)) { if(0 != textStringBuilder.length()) { String text = textStringBuilder.toString(); textStringBuilder.delete(0, textStringBuilder.length()); FileNameEntry fileNameEntry = new FileNameEntry(text, -1); rs.add(fileNameEntry); } numberStringBuilder.append(c); } else { if(0 != numberStringBuilder.length()) { String text = numberStringBuilder.toString(); numberStringBuilder.delete(0, numberStringBuilder.length()); long number = MyStringUtil.parseLong(text, (long)-1); FileNameEntry fileNameEntry = new FileNameEntry(text, number); rs.add(fileNameEntry); } textStringBuilder.append(c); } } if(0 != textStringBuilder.length()) { String text = textStringBuilder.toString(); textStringBuilder.delete(0, textStringBuilder.length()); FileNameEntry fileNameEntry = new FileNameEntry(text, -1); rs.add(fileNameEntry); } if(0 != numberStringBuilder.length()) { String text = numberStringBuilder.toString(); numberStringBuilder.delete(0, numberStringBuilder.length()); long number = MyStringUtil.parseLong(text, (long)-1); FileNameEntry fileNameEntry = new FileNameEntry(text, number); rs.add(fileNameEntry); } } return rs; } private FileNameEntry(String text, long number) { this.setText(text); this.setNumber(number); } public String getText() { return this.text; } public long getNumber() { return this.number; } @Override public String toString() { return String.format("text=%s,number=%d", this.text, this.number); } @Override public int compareTo(FileNameEntry entry) { int rs = 0; if(null != entry) { String text = entry.getText(); long number = entry.getNumber(); if(0


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3