按升序排列列表中的元素(首先以递增方式排列百分比,然后不区分大小写字母)

桑托什·卡马特

我有一个对象列表

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章