对包含数字和字母的ArrayList <String>进行排序

问题描述

我有一个ArrayList<String>,其中包含“建筑物钥匙”编号列表。
如果您在通过搜索找到解决方案之前已经回答了这个问题,请原谅我。

public class SortKeyNumbers {
    
    public static void main(String args[]) {
        
        ArrayList<String> keys = new ArrayList<>();
        
        keys.add("1");
        keys.add("10");
        keys.add("2");
        keys.add("3");
        keys.add("3B");
        keys.add("12");
        keys.add("12C");
        keys.add("21");
        keys.add("32");
        
        Collections.sort(keys);
        
        System.out.println(keys);
        
    }
    
}

这给了我[1,10,12,12C,2,21,3,32,3B]输出
我知道这是Collections.sort的预期结果
我需要的是[1,3B,32]

输出

我要问的是帮助编写正确的comparatorcompareto以获得所需的输出

解决方法

您可以使用比较器功能,该功能将从键中剥离所有非数字字符,然后将其解析为整数:

Collections.sort(keys,Comparator.comparing(s -> Integer.parseInt(s.replaceAll("[^\\d]",""))));

输出:

[1,2,3,3B,10,12,12C,21,32]
,

您可以使用ArrayList.sort并通过删除非数字来仅比较整数

keys.sort(Comparator.comparing(str-> Integer.valueOf(str.replaceAll("\\D+",""))));