java 实体List按照某个字段排序,先按照这个字段的英文字母倒排,再按照这个字段英文后的数字正排,再按照数字后面的英文正排,这个字段例如这四个字段排序应为:R001,R001N,AM001,AA001N
时间: 2024-05-02 08:16:50 浏览: 123
可以使用Java中的Comparator接口来实现按照指定字段排序。首先按照字段的英文字母倒排,可以直接使用String的compareTo方法进行比较,然后再按照英文后的数字正排和数字后的英文正排,可以使用正则表达式来提取数字和非数字部分进行比较。
示例代码如下:
```java
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class EntityComparator implements Comparator<Entity> {
@Override
public int compare(Entity e1, Entity e2) {
String field1 = e1.getField();
String field2 = e2.getField();
int result = field2.compareTo(field1); // 按照字段的英文字母倒排
if (result != 0) {
return result;
}
// 提取数字和非数字部分进行比较
Pattern pattern = Pattern.compile("(\\D*)(\\d*)");
Matcher matcher1 = pattern.matcher(field1);
Matcher matcher2 = pattern.matcher(field2);
if (matcher1.find() && matcher2.find()) {
String nonDigit1 = matcher1.group(1);
String nonDigit2 = matcher2.group(1);
result = nonDigit1.compareTo(nonDigit2);
if (result != 0) {
return result;
}
String digit1 = matcher1.group(2);
String digit2 = matcher2.group(2);
result = Integer.compare(Integer.parseInt(digit1), Integer.parseInt(digit2));
if (result != 0) {
return result;
}
}
// 如果字段格式不符合要求,则按照默认顺序排列
return field1.compareTo(field2);
}
public static void main(String[] args) {
List<Entity> entities = ...; // 实体列表
entities.sort(new EntityComparator());
// 排序后的实体列表
}
}
class Entity {
private String field;
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
}
```
其中,Entity类表示实体,包含要排序的字段field;EntityComparator类实现了Comparator接口,实现compare方法进行排序。在compare方法中,先按照字段的英文字母倒排,如果相同则按照数字和非数字部分进行比较。使用正则表达式提取数字和非数字部分,然后分别比较。如果字段格式不符合要求,则按照默认顺序排列。最后,在main方法中调用List的sort方法进行排序。
阅读全文