解决java中按照数字大小来排序文件
我们想要输出(1.jpg、2.jpg、3.jpg、10.jpg、11.jpg、20.jpg、21.jpg、31.jpg)
突然看到网上一些写法
总结:既然自己按照定义的文件名规则来处理,也可以进行使用正则表达,简化使用
File[] files = file.listFiles();
if(files==null)return resultFileName;
List<File> fileList = new ArrayList<File>();
for (File f : files) {
fileList.add(f);
} Collections.sort(fileList, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
if (o1.isDirectory() && o2.isFile())
return -1;
if (o1.isFile() && o2.isDirectory())
return 1;
return o2.getName().compareTo(o1.getName());
}
}); for (File f : fileList) {
if(f.isDirectory()){
resultFileName.add(f.getPath());
ergodic(f,resultFileName);
}else
resultFileName.add(f.getPath());
}
但是它输出的是:(1.jpg、10.jpg、11.jpg、2.jpg、20.jpg、21.jpg、3.jpg、31.jpg)
看到这个明显是按照字典顺序来排序的 既然我们想要按照Integer 大小来进行排序处理
 public static void main(String[] args) throws IOException {
         File file = new File(path);
         File[] files = file.listFiles();
         ArrayList<File> list = new ArrayList<>();
         for (File file2 : files) {
             list.add(file2);
         }
         Collections.sort(list, new Comparator<File>() {
             @Override
             public int compare(File o1, File o2) {
                 if (o1.isDirectory() && o2.isFile())
                     return -1;
                 if (o1.isFile() && o2.isDirectory())
                     return 1;
                 Integer f = f(o1.getName());
                 Integer f2 = f(o2.getName());
                 return Integer.compare(f, f2);
             }
         });
         for (File file2 : list) {
             System.out.println(file2.getName());
         }
     }
     static Integer f(String filename) {
         int x = filename.indexOf(".");
         String string2 = filename.substring(0,x);
         char[] cs = string2.toCharArray();
         StringBuilder builder = new StringBuilder();
         for (int i = 0; i < cs.length; i++) {
             if(Character.isDigit(cs[i])) {
                 builder.append(cs[i]);
             }
         }
         return Integer.parseInt(builder.toString());
     }
使用正则表达式
 public final class FileString implements Comparable<FileString> {
     private final String fileName;
     private final int prefix_num;
     Pattern number = Pattern.compile("(\\d+)\\..*");
     public FileString(String fileName) {
         this.fileName = fileName;
         Matcher matcher = number.matcher(fileName);
         if (matcher.find()) {
             prefix_num = Integer.parseInt(matcher.group(1));
         } else {
             prefix_num = 0;
         }
     }
     @Override
     public int compareTo(FileString o) {
         return o.prefix_num > prefix_num ? -1 : o.prefix_num == prefix_num ? 0 : 1;
     }
     @Override
     public String toString() {
         return fileName;
     }
 }
解决java中按照数字大小来排序文件的更多相关文章
- 浅谈利用同步机制解决Java中的线程安全问题
		
我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...
 - java 中对象比较大小
		
java 中对象比较大小 java 中对象比较大小有两种方法 1:实现Comparable 接口 的 public int compareTo(T o) 方法: 2:实现Comparator 接口 的 ...
 - 3.键盘输入10个数,放到数组中,(1)去除该数组中大于10的数 	(2)将该数组中的数字写入到本地文件number.txt中
		
package cn.it.text; import java.io.FileWriter; import java.io.IOException; import java.util.Scanner; ...
 - java中File的delete()方法删除文件失败的原因
		
java中File的delete()方法删除文件失败的原因 学习了:http://hujinfan.iteye.com/blog/1266387 的确是忘记关闭了: 引用原文膜拜一下: 一般来说 ja ...
 - java中如何创建带路径的文件
		
请教各位大侠了,java中如何创建带路径的文件,说明下 这个路径不存在 ------回答--------- ------其他回答(2分)--------- Java code File f = new ...
 - 解决VSCode中使用vetur插件格式化vue文件时,js代码会自动加上冒号和分号
		
解决VSCode中使用vetur插件格式化vue文件时,js代码会自动加上冒号和分号 在设置中把"vetur.format.defaultFormatter.js": " ...
 - Java中8种常见的排序方法
		
排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少 ...
 - 如何让SQLServer的 itemNum 字段 按照数字大小顺序排序
		
我的 itemNum 从1到20,可是超过了SQLServer的默认排序这样的1101112...19234567如何才能让排序成为这样1234567891011.. . 解决办法:因为 itemNu ...
 - 解决java中对URL编码的问题
		
首先查看javascript中的encodeURI和encodeURLComponent方法的区别. encodeURI:不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行 ...
 
随机推荐
- win 10 安装.msi 程序出现the error code is 2503
			
解决方法: C:\Windows\temp文件夹的权限不够,需要给其更高权限 右键temp文件夹 点击属性进入属性对话框 组或用户名的里面的All APPLICATION PACKAGES和所有受限制 ...
 - 深入理解JVM - Java内存模型与线程 - 第十二章
			
Java内存模型 主内存与工作内存 Java内存模型主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.此处的变量(Variable)与Java编程中 ...
 - 基于深度学习的目标检测算法:SSD——常见的目标检测算法
			
from:https://blog.csdn.net/u013989576/article/details/73439202 问题引入: 目前,常见的目标检测算法,如Faster R-CNN,存在着速 ...
 - 连接并同步windows下的git仓库
			
1. 需求 电脑A和电脑B本来通过服务器同步工作目录.服务器时linux系统上有个裸仓库,不管在A上还是B上工作,工作完毕后使用git go与服务器仓库同步.A和B都是windows系统,在工作目录下 ...
 - (转)C++经典面试题(最全,面中率最高)
			
1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数.malloc与free是C++/C语言的标准库函数,new ...
 - BZOJ-1568: Blue Mary开公司 (李超线段树)
			
Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词“Query”或“Project”. 若单词为Query,则后接一个整数T,表示Blue ...
 - 「LuoguP1725」琪露诺(dp 单调队列
			
题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到河岸去追 ...
 - codevs 1144 守望者的逃离
			
传送门 1144 守望者的逃离 2007年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 恶 ...
 - IE滚动条
			
之前一直没留意过IE下面的滚动条样式,今天碰到一个优化需求,需要去掉横向的滚动条,只保留竖的滚动条. 实现方式很简单,设置宽度,overflow-x:hiddle:overflow-y:scroll ...
 - 获取.net对象的属性集
			
int count = System. ComponentModel.TypeDescriptor .GetProperties( StudyInfo).Count ; ...