解决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 标点符号进行 ...
随机推荐
- Java里的阻塞队列
JDK7提供了7个阻塞队列,如下: ArrayBlockingQueue : 一个数组结构组成的有界阻塞队列. LinkedBlockingQueue : 一个由链表结构组成的有界阻塞队列 . Pr ...
- insert …select …带来的死锁问题
mysql中 insert …select …带来的问题 当使用insert...select...进行记录的插入时,如果select的表是innodb类型的,不论insert的表是什么类型的表,都会 ...
- 华为机试 可怕的N阶乘
题目标题: 计算阶乘n!是一件可怕的事情,因为当n并不是很大时,n!将是一个很大的值.例如13! = 6227020800,已经超过了我们常用的unsigned int类型的取值范围.请设计一个程序, ...
- hdu-5784 How Many Triangles(计算几何+极角排序)
题目链接: How Many Triangles Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- java-03 方法
#############练习###################### 1.键盘录入乘法表 import java.util.Scanner; public class PrintNN { pub ...
- Java命名规范(简略)
1.包 全部小写,由域名定义前缀. 例如:teach.golddrem.javagroup 2.类 开头字母大写,后边每个单词的首字母都大写.如果有缩写,缩写部分全部大写. 例如:Informatio ...
- Standby Redo Log 的设定原则、创建、删除、查看、归档位置
设定: 1.每个standby redo log file 至少要和primary database的redo log 一样大,为了方便管理,Oracle 建议主备库的redo log 设置成一样的大 ...
- 51nod 1218 最长递增子序列 V2——LIS+思路(套路)
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218 自己怎么连这种 喜闻乐见的大水题 都做不出来了…… 好像见过 ...
- POJ2182(排队问题)
Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10695 Accepted: 6865 Descri ...
- js css3实现钟表效果
原理: 利用transform-origin改变旋转的圆心,实现秒数和分钟数的刻度线,利用transfrom translate实现钟表小时刻度的显示 html: <div class=&quo ...