文件智能排序(根据文件名称中的数字编号排序) |
您所在的位置:网站首页 › 怎么按照名称排序 › 文件智能排序(根据文件名称中的数字编号排序) |
最近需要编写一个将一系列图片合并为一个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 |