我有一个对象列表
List<Label> toReturn = new ArrayList<Label>();
toReturn.add(new Label("hbc"));
toReturn.add(new Label("Abc"));
toReturn.add(new Label("dbc"));
toReturn.add(new Label("0%"));
toReturn.add(new Label("10%"));
toReturn.add(new Label("20%"));
toReturn.add(new Label("40%"));
toReturn.add(new Label("100%"));
Label pojo 具有字符串属性 label 。我想按字母顺序对列表进行排序。百分比应以递增方式首先出现,然后是不区分大小写的字母
我已经使用了代码片段
toReturn.sort(Comparator.comparing(Label::getLabel, String.CASE_INSENSITIVE_ORDER));
对列表中具有属性标签的元素进行排序,顺序为“0%”、“10%”、“100%”、“20%”、“40%”、“Abc”、“dbc”、“hbc”
但我想要按顺序 "0%","10%","20%","40%","100%","Abc","dbc","hbc"
如何解决这个问题?
最佳答案
您使用的比较器应用字典顺序(其中 1 在 2 之前,依此类推)。它不知道任何数字模式。编写与正则表达式匹配的自定义比较器很容易:
private static final Pattern PATTERN = Pattern.compile("(\\d+)%");
...
toReturn.sort((l1, l2) -> {
var matcher1 = PATTERN.matcher(l1.label);
var matcher2 = PATTERN.matcher(l2.label);
if (matcher1.matches() && matcher2.matches()) {
int value1 = Integer.parseInt(matcher1.group(1));
int value2 = Integer.parseInt(matcher2.group(1));
return Integer.compare(value1, value2);
}
return l1.label.compareToIgnoreCase(l2.label);
});
关于java - 按升序排列列表中的元素(首先是按递增方式排列的百分比,然后是不区分大小写的字母),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67906129/