我有一个对象列表
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%"));
标签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);
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句