在数字前使用字母对 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<String>() @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 进行排序的主要内容,如果未能解决你的问题,请参考以下文章