java - 如何对字母数字字符串进行排序

标签 java sorting

我在对包含整数的字符串进行排序时遇到问题。如果我使用下面的代码,我会得到如下排序: 1人,2人,20人,21人,3人,一些

但是我希望它像这样排序: 1人,2人,3人,20人,21人,一些

我该怎么做?

谢谢!

Collections.sort(selectedNodes,
    new Comparator<DefaultMutableTreeNode>() {
    @Override
    public int compare(DefaultMutableTreeNode o1,
        DefaultMutableTreeNode o2) {
        return o1.getUserObject().toString()
            .compareTo(o2.getUserObject().toString());
    }
    });

最佳答案

这是一个关于如何执行此操作的独立示例(未特别优化):

final Pattern p = Pattern.compile("^\\d+");
String[] examples = { 
   "1some", "2some", "20some", "21some", "3some", "some", "1abc", "abc"
};
Comparator<String> c = new Comparator<String>() {
    @Override
    public int compare(String object1, String object2) {
        Matcher m = p.matcher(object1);
        Integer number1 = null;
        if (!m.find()) {
            return object1.compareTo(object2);
        }
        else {
            Integer number2 = null;
            number1 = Integer.parseInt(m.group());
            m = p.matcher(object2);
            if (!m.find()) {
                return object1.compareTo(object2);
            }
            else {
                number2 = Integer.parseInt(m.group());
                int comparison = number1.compareTo(number2);
                if (comparison != 0) {
                    return comparison;
                }
                else {
                    return object1.compareTo(object2);
                }
            }
        }
    }
};
List<String> examplesList = new ArrayList<String>(Arrays.asList(examples));
Collections.sort(examplesList, c);
System.out.println(examplesList);

输出

[1abc, 1some, 2some, 3some, 20some, 21some, abc, some]

解释

  • 该示例使用常量 Pattern 来推断数字是否位于 String 的起始位置。
  • 如果第一个 String 中不存在,它将按原样与第二个进行比较。
  • 如果第一个确实存在,它会检查第二个。
  • 如果第二个中不存在,它将再次按原样比较两个 String
  • 如果两者都存在,它将比较 Integer 而不是整个 String,因此导致数值比较而不是字典序比较
  • 如果数字比较相同,则返回到整个 String 的字典序比较(感谢 MihaiC 发现这一点)

关于java - 如何对字母数字字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27169234/

相关文章:

javascript - 对包含数字的 JavaScript 字符串数组进行排序

java - 使用java(netbeans),windows在sqlite中进行数据排序

c# - 对列表进行排序并为每个项目赋予新的排序索引

java - 试图为Java(JSP)中的随机数设置范围,但我不确定如何处理

java - 获取Javascript标签内容

java - 无法使用 oracle.apex.APEXExport 类登录数据库

php - Woocommerce - 在多供应商设置中按作者/用户对购物车中的产品进行排序

java - 如何创建无卡全屏 Android Wear 应用

java - 使用 protected block 同步 Hibernate 插入

java - 帮助我了解 title.compareTo(a.title()); 的幕后花絮内码