java_文件名排序
来源:互联网 发布:围棋软件哪个好 编辑:程序博客网 时间:2024/06/14 16:19
本文章有参考过其他博客文章,因当时没有保存下原博客链接,无法粘贴处原地址。
文件名排序问题
本文章主要使用了Comparator接口和compareTo(String anotherString)方法,详情可以参见javaApi文档。
- public interface Comparator
强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。
- public int compareTo(String anotherString)
按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。按字典顺序将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0;compareTo 只在方法 equals(Object) 返回 true 时才返回 0。
名称排序顺序:某些特殊字符<数字<字母<等等。。。
两个比较的排序的文字是: 3 s
比较结果值
0 相同不存入(不排序)
1 升序 (s 3)
-1 降序 (3 s)
例如:
//该list集合中值存放文件名称
List list = new ArrayList<>();
list.add(“312fsadradvqt41314hoif9we7592hf.jpg”);
list.add(“SDTR3R4353-314hoif9we7592hf.jpg”);
//将上面的集合作为参数传入进去进行比较。
public void sortEvidenceAttch (List list) {
Collections.sort(list, new Comparator() {
protected List split(String s) {
List list = new ArrayList();
char[] cs = s.toCharArray();
// 记录数字单元开头的索引位置
int tmp = -1;
for (int i = 0; i < cs.length; i++) {
char c = cs[i];
if (Character.isDigit(c)) {
if (tmp < 0) {
tmp = i;
}
} else {
if (tmp >= 0) {
// 将该字符之前的数字部分加入比较单元
list.add(s.substring(tmp, i));
tmp = -1;
}
list.add(String.valueOf(c));
}
}
// 如果最后一个是数字,将最后的数字加入list中
if (Character.isDigit(cs[cs.length - 1])) {
tmp = tmp < 0 ? cs.length - 1 : tmp;
list.add(s.substring(tmp, cs.length));
tmp = -1;
}
return list;
}
/**
*
* 比较各数字单元的长度
*
* @param s1
* @param s2
* @return
*/
private int compareNumberPart(String s1, String s2) {
int r = 0;
String[] ss1 = s1.split(“\D+”);
String[] ss2 = s2.split(“\D+”);
for (int i = 0; i < ss1.length; i++) {
r = compareValueEqualNumber(ss1[i], ss2[i]);
if (r != 0) {
return r;
}
}
return r;
}
/** * * 比较两个数字字符串表示的数字值的大小 * * @param s1 * @param s2 * @return */ private int compareNumber(String s1, String s2) { int max = String.valueOf((Integer.MAX_VALUE)).length() - 1; int r = 0; if (s1.length() > max || s2.length() > max) { r = new BigInteger(s1).compareTo(new BigInteger(s2)); } else { r = Integer.valueOf(s1).compareTo(Integer.valueOf(s2)); } return r; } /** * * 比较数字相等的数字文本的大小,规则:位数较多者较小 * * @param s1 * @param s2 * @return */ private int compareValueEqualNumber(String s1, String s2) { int r = 0; if (s1.length() > s2.length()) { r = -1; } else if (s1.length() < s2.length()) { r = 1; } else { r = 0; } return r; } @Override public int compare(EvidenceAttach evidenceAttach1, EvidenceAttach evidenceAttach2) { // 省略提前判断和大小写转换部分的代码 详见附件 List<String> ss1 = split(evidenceAttach1.getAttName().toLowerCase()); List<String> ss2 = split(evidenceAttach2.getAttName().toLowerCase()); // 取两个比较单元的最小长度 int len = ss1.size() < ss2.size() ? ss1.size() : ss2.size(); // 比较结果 int r = 0; // t1、t2 对应比较单元 String t1 = null; String t2 = null; // b1 b2 标识比较单元是否为数字 boolean b1 = false; boolean b2 = false; for (int i = 0; i < len; i++) { t1 = ss1.get(i); t2 = ss2.get(i); b1 = Character.isDigit(t1.charAt(0)); b2 = Character.isDigit(t2.charAt(0)); // t1是数字 t2非数字 if (b1 && !b2) { return -1; } // t2是数字 t1非数字 if (!b1 && b2) { return 1; } // t1、t2 非数字 if (!b1 && !b2) { r = t1.compareTo(t2); if (r != 0) { return r; } } // t1 t2都是数字 if (b1 && b2) { r = compareNumber(t1, t2); if (r != 0) { return r; } } } // 如果两个集合的 0-(len-1)部分相等 if (r == 0) { if (ss1.size() > ss2.size()) { r = 1; } else if (ss1.size() < ss2.size()) { r = -1; } else { r = compareNumberPart(evidenceAttach1.getAttName().toLowerCase(), evidenceAttach2.getAttName().toLowerCase()); } } return r; } });}
如有待完善或不足的地方,欢迎留言或私信指出。
路漫漫其修远兮,吾将上下而求索。
- java_文件名排序
- java_排序
- Java_排序
- java_获取文件中的文件名
- Java_比较和排序
- java_选择排序
- java_冒泡排序
- JAVA_希尔排序
- JAVA_数组排序方法
- JAVA_快速排序
- java_冒泡排序
- java_排序_查找
- java_归并排序
- Java_快速排序
- java_堆排序
- 文件名排序
- JAVA_选择排序、冒泡排序
- Java_数组操作_排序
- laravel 目录结构
- 从勒索软件到工控系统网络安全
- nodejs和npm安装
- 正负数取反
- 做机械臂导航时遇到的问题5:如何使用ROS内嵌serial功能包实现串口通信
- java_文件名排序
- nuttx飞控操作系统
- Docker认识
- java校招需要准备的全部内容
- 浅析PCI配置空间
- 数据库如何把null转化为空字符
- The advance of Java -- Genericity, Exception, IO(Day04)
- hash_map 这个非stl的容器,基于hash table实现
- network structure--dense and resnet