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

标签 java java-8

我有一个对象列表

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/

相关文章:

java - 关于 Java 泛型下限用法 : ? super T

Java单元测试无法访问ResourceBundle

java - Java 搜索算法 - 电梯递归函数 - 与基本情况的斗争

java - 当断点位于父类中时,Eclipse 调试器无法找到源代码

java - 对象未保存在数据库中,使用 Spring Boot Rest Api 以 @OneToOne 关系保存

REST服务中的Java 8 Lambda表达式不起作用

java - 使用 Stream 避免 NoSuchElementException

java - 调用 Spring bean 的函数接口(interface)

java - 比较器不工作,我找不到错误

Java8使用流从类对象中提取多个字段