Java 排序数组列表<;字符串>;包含数字和字母的

Java 排序数组列表<;字符串>;包含数字和字母的,java,string,sorting,arraylist,comparator,Java,String,Sorting,Arraylist,Comparator,我有一个ArrayList,其中包含“建筑钥匙”编号的列表。 如果在我努力通过搜索找到解决方案之前已经回答了,请原谅我 public class SortKeyNumbers { public static void main(String args[]) { ArrayList<String> keys = new ArrayList<>(); keys.add("1&quo

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

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);
        
    }
    
}
公共类SortKeyNumber{
公共静态void main(字符串参数[]){
ArrayList键=新的ArrayList();
添加(“1”);
添加(“10”);
添加(“2”);
添加(“3”);
添加(“3B”);
添加(“12”);
添加(“12C”);
添加(“21”);
添加(“32”);
集合。排序(键);
系统输出打印项次(按键);
}
}
这给了我一个
[1,10,12,12C,2,21,3,32,3B]

我知道这是从
Collections.sort中预期的
我需要的是
[1,2,3,3B,10,12,12C,21,32]


我要求的是帮助编写正确的
比较器
比较器
,以获得所需的输出。

您可以使用比较器函数,从键中去除任何非数字字符,然后将其解析为整数:

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

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

您可以使用比较器函数,从键中去除任何非数字字符,然后将其解析为整数:

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

[1, 2, 3, 3B, 10, 12, 12C, 21, 32]
通过删除非数字,您可以使用并仅比较整数

keys.sort(Comparator.comparing(str-> Integer.valueOf(str.replaceAll("\\D+",""))));
通过删除非数字,您可以使用并仅比较整数

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

看起来很容易!我试着在加上“12C”之后再加上“12B”,但它没有按字母数字排序。“有没有一种方法也能把它结合起来呢?”@Tonkatomy。有没有一种方法也可以将其合并编写一个合适的比较器,并将所有规则合并到比较器中。@tonkatomy如果您先按字母顺序排序(
集合。排序(键)
),然后使用此函数,这些值将按您的意愿排序(因为Java排序是稳定的),看起来很容易!我试着在加上“12C”之后再加上“12B”,但它没有按字母数字排序。“有没有一种方法也能把它结合起来呢?”@Tonkatomy。有没有一种方法也可以将其合并编写一个合适的比较器,并将所有规则合并到比较器中。@tonkatomy如果您先按字母顺序排序(
Collections.sort(keys)
),然后使用此函数,这些值将按您的需要排序(因为Java排序是稳定的)我所要求的是帮助编写正确的比较器或比较器,以实现所需的输出。-你的尝试在哪里?也许我们可以就如何改进提出建议。我们甚至不知道全部要求。例如,它的结尾只能包含一个字符或多个字符。首先是什么“12”或“12C”?我要求的是帮助编写正确的比较器或比较器,以实现所需的输出。-你的尝试在哪里?也许我们可以就如何改进提出建议。我们甚至不知道全部要求。例如,它的结尾只能包含一个字符或多个字符。什么是“12”或“12C”?