解决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 标点符号进行 ...
随机推荐
- jQuery移动光标改变图像
脚本代码移动光标改变图像是一款让你通过移动光标显示和调整多个图像或其他方法来触发. 代码:http://www.huiyi8.com/sc/10628.html
- python to 可执行文件
cx_Freeze for Windows, Linux, and Mac OS X (Python 2.7, 3.x) pyinstaller for Windows, Linux, and Mac ...
- IDEAL葵花宝典:java代码开发规范插件 lombok 插件
前言: lombok简介: lombok是暑假来到公司实习的时候发现的一个非常好用的小工具,刚见到的时候就感觉非常惊艳,有一种相见恨晚的感觉,用了一段时间之后感觉的确挺不错,所以特此来推荐一下. 那么 ...
- __declspec(dllimport)的小秘密(转)
昨天和同事使用一个dll(lib+dll)的时候,发现他在引用头文件是,并没有使用__declspec(dllimport),但是程序完全运行正常,不明觉厉下,去网上翻了下资料,原来是链接器的原因,这 ...
- leetcode 290 Word Pattern(map的应用)
Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...
- HihoCoder1677 : 翻转字符串(Splay)(区间翻转)
描述 给定一个字符串S,小Hi希望对S进行K次翻转操作. 每次翻转小Hi会指定两个整数Li和Ri,表示要将S[Li..Ri]进行翻转.(S下标从0开始,即S[0]是第一个字母) 例如对于S=" ...
- python之系统编程 --进程
1.调试(PDB) 代码: [root@master gaoji]# vim test2.py 1 #!/usr/local/bin/python3 2 # -*- coding:utf-8 -*- ...
- BZOJ_4987_Tree_树形DP
BZOJ_4987_Tree_树形DP Description 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. Input 第一 ...
- Redo Gap 处理与优化
理论背景 当redo data 传送发生中断时就会产生redo gap.当redo 传送恢复正常以后,redo transport service 会自动检测redo gap并发送缺失的redo 到d ...
- 兼容ie6,ie7,ie8,firefox,chrome浏览器的代码片段
hack实现方式和原理 #hacker{ color:red; *color:white; /*for ie6,ie7*/ *+color:blue; /*for ie7*/ _color:gray; ...