在数字前使用字母对 Java ArrayList 进行排序

Posted

技术标签:

【中文标题】在数字前使用字母对 Java ArrayList 进行排序【英文标题】:Sort Java ArrayList with Letters before numbers 【发布时间】:2017-08-02 00:47:59 【问题描述】:

我目前正在传入一个 ArrayList 来填充 android 中 TabLayout 的标题。数组中的元素是字符串:["RCP", "RYL", "1", "2", "3", "4", "5", "6"]. 但是,不一定按这个顺序。

我希望先返回带有 Letter 元素的列表(按字母顺序),然​​后递增整数。

我尝试过使用Collections.sort 方法,但这会返回一个数字上升的列表,然后最后添加“R”字符串:["1", "2", "3", "4", "5", "6", "RCP", "RYL"]

为了澄清,我想对我的 ArrayList 进行排序,以便它返回 ["RCP", "RYL", "1", "2", "3", "4", "5", "6"] 它还需要灵活,因为“R”的标题,字符串,可能会改变。

谢谢

【问题讨论】:

自定义比较器可能会起作用。 整数也可能改变吗?您是否可能在某个时间点有 2 位或更多位的数字,并希望结果中的“9”出现在“10”之前? 整数可能带有字符串值后缀。 IE。 ["1AB", "1AV"]。然后需要先按字符串前缀的顺序打印,然后是数字前缀,即["RCA", "RLM", "1EP", "1FT", "2LJ", "2MO"],依此类推。我还没有检查这个... 【参考方案1】:

如果您希望代表数字的字符串优先于不代表数字的字符串,您应该考虑编写自己的 Comparator 并将其传递给 Collections.sort 方法。

这是解决您的问题的一种简单方法:检查是否有任何字符串是数字,如果是,则优先考虑不是数字的字符串。如果两者都是数字或字符串,则使用字符串的compareTo 方法。

希望对你有帮助。

public class Main 

    private static int customCompare(String a, String b) 
        return isThereAnyNumber(a, b)
                ? isNumber(a) ? 1 : -1
                : a.compareTo(b);
    

    private static boolean isThereAnyNumber(String a, String b) 
        return isNumber(a) || isNumber(b);
    

    private static boolean isNumber(String s) 
        return s.matches("[-+]?\\d*\\.?\\d+");
    

    public static void main(String[] args) 
        List<String> list = Arrays.asList("RCP", "RYL", "1", "2", "3", "4", "5", "6");
        Collections.sort(list, Main::customCompare);
        System.out.println(list);
    

更新

如果您不使用 Java 8,您可以使用实现 Comparator 接口的匿名内部类。

public class Main 

    public static void main(String[] args) 
        List<String> list = Arrays.asList("RCP", "RYL", "1", "2", "3", "4", "5", "6");
        Collections.sort(list, new Comparator<String>() 
            private boolean isThereAnyNumber(String a, String b) 
                return isNumber(a) || isNumber(b);
            

            private boolean isNumber(String s) 
                return s.matches("[-+]?\\d*\\.?\\d+");
            

            @Override
            public int compare(String a, String b) 
                return isThereAnyNumber(a, b)
                        ? isNumber(a) ? 1 : -1
                        : a.compareTo(b);
            
        );
        System.out.println(list);
    

【讨论】:

感谢您的努力。我无法在 Android 中调用 Collections.sort(list, Main::customCompare);,但它会抛出:“此语言级别不支持方法引用”。有什么想法吗? @dantan04 我提供了一个不使用 lambda 的新解决方案,以防您不使用 Java 8 或在 Android 中不支持我使用的某些东西(如方法引用)。希望它现在有效。 这很有帮助!我通过以下方式创建了这个:Collections.sort(list, new Comparator&lt;String&gt;() @Override public int compare(String s, String t1) customCompare(s, t1); return 0; ); 返回列表:["6", "5", "4", "3", "2", "1", "R"] 我现在只需要反转它,有没有办法? @dantan04 你的 sn-p 中的问题是你的 compare 方法返回 0,它应该返回 customCompare 的结果。因此,您应该将 compare 方法主体中的两行替换为 return customCompare(s, t1); 希望能解决您的问题【参考方案2】:

Collections.sort 有一个重载,它将接收 Comparator,这将允许您定义项目的排序顺序。在这种情况下,您只需定义自己的 Comparator 接口实现即可。

【讨论】:

谢谢,我现在正在阅读Comparator 文档。 (我目前正在从一本好书学习android,所以它是稳定的进步)。

以上是关于在数字前使用字母对 Java ArrayList 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

java字母和数字排列组合后

JAVA排序数字字母混合

Java中如何对集合排序

I/O 文件异常:不包含前两个元素的 ArrayList 值 (JAVA)

如何用java实现模糊查询

C# ArrayList的排序