You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让字符串数组按字母排序且标点符号优先?

自定义排序实现标点开头元素优先排序

默认的Arrays.sort(array)会按照字符串的自然顺序排序,所以字母开头的元素会排在前面。要实现标点开头的元素排在首位的需求,你需要自定义一个排序规则,通过Comparator来告诉排序方法如何比较两个字符串。

实现思路

核心逻辑很简单:

  • 先判断两个字符串的第一个字符是否为标点符号
  • 如果一个是标点开头、另一个不是,让标点开头的排在前面
  • 如果两者开头类型相同(都是标点或都是字母),则按照默认的自然顺序排序

代码示例(Java 7及之前版本)

import java.util.Arrays;
import java.util.Comparator;

public class CustomSortDemo {
    public static void main(String[] args) {
        String[] array = { "Carol", "`-=[]\\;',.//uF18*-+~!@#$*" };
        
        Arrays.sort(array, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                // 处理空字符串的边界情况,避免索引越界
                if (s1.isEmpty() && s2.isEmpty()) return 0;
                if (s1.isEmpty()) return -1; // 空字符串位置可根据需求调整
                if (s2.isEmpty()) return 1;
                
                char firstChar1 = s1.charAt(0);
                char firstChar2 = s2.charAt(0);
                
                // 判断第一个字符是否为标点符号
                boolean isS1Punct = Character.isPunctuation(firstChar1);
                boolean isS2Punct = Character.isPunctuation(firstChar2);
                
                // 优先级判断:标点开头的排前面
                if (isS1Punct && !isS2Punct) {
                    return -1;
                }
                if (!isS1Punct && isS2Punct) {
                    return 1;
                }
                
                // 同类型开头的,按自然顺序排序
                return s1.compareTo(s2);
            }
        });
        
        // 输出验证结果
        for (String str : array) {
            System.out.println(str);
        }
    }
}

Java 8+ 简化版(Lambda表达式)

如果你的项目使用Java 8或更高版本,可以用Lambda表达式简化代码,让逻辑更紧凑:

import java.util.Arrays;

public class CustomSortLambdaDemo {
    public static void main(String[] args) {
        String[] array = { "Carol", "`-=[]\\;',.//uF18*-+~!@#$*" };
        
        Arrays.sort(array, (s1, s2) -> {
            if (s1.isEmpty() && s2.isEmpty()) return 0;
            if (s1.isEmpty()) return -1;
            if (s2.isEmpty()) return 1;
            
            char c1 = s1.charAt(0);
            char c2 = s2.charAt(0);
            
            boolean isS1Punct = Character.isPunctuation(c1);
            boolean isS2Punct = Character.isPunctuation(c2);
            
            // 用三元运算符简化判断逻辑
            return isS1Punct != isS2Punct 
                ? isS1Punct ? -1 : 1 
                : s1.compareTo(s2);
        });
        
        // 输出结果
        for (String str : array) {
            System.out.println(str);
        }
    }
}

注意事项

  • Character.isPunctuation()能识别大部分常见标点符号(包括你示例中的`符号),如果需要更精准的范围,可以自定义判断规则(比如指定字符范围)。
  • 代码中加入了空字符串的处理,避免调用charAt(0)时抛出StringIndexOutOfBoundsException,你可以根据实际需求调整空字符串的排序位置。

内容的提问来源于stack exchange,提问作者Aaron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:50:09