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

Java中如何对含印地语名称、特殊字符、数字的字符串List排序

Java 含印地语/特殊字符/数字的字符串List排序方案

要实现指定顺序的排序(印地语内容在前,其次特殊字符、数字开头内容,最后普通英文字符串),不能直接依赖字符串默认Unicode排序,需要自定义比较器按优先级规则排序。

排序优先级规则

对应示例要求的排序权重(权重越低越靠前):

  • 印地语(天城文)字符串:权重0,优先级最高
  • 特殊字符开头字符串:权重1,优先级第二
  • 数字开头混合字符串:权重2,优先级第三
  • 普通英文字母开头字符串:权重3,优先级最低

实现代码

直接用JDK原生API实现,无需引入第三方依赖:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.text.Collator;
import java.util.Locale;

public class CustomStringSort {
    // 优先级权重常量
    private static final int WEIGHT_HINDI = 0;
    private static final int WEIGHT_SPECIAL = 1;
    private static final int WEIGHT_NUM_START = 2;
    private static final int WEIGHT_ENGLISH = 3;

    // 计算字符串所属分类的权重
    private static int calcWeight(String content) {
        if (content == null || content.length() == 0) return Integer.MAX_VALUE;
        char first = content.charAt(0);
        // 天城文(印地语)Unicode区间:U+0900 ~ U+097F
        if (first >= '\u0900' && first <= '\u097F') {
            return WEIGHT_HINDI;
        }
        if (Character.isDigit(first)) {
            return WEIGHT_NUM_START;
        }
        if (Character.isLetter(first)) {
            return WEIGHT_ENGLISH;
        }
        return WEIGHT_SPECIAL;
    }

    public static void main(String[] args) {
        List<String> testList = new ArrayList<>(Arrays.asList("!@#", "hindi", "अभिवादन", "12dhs"));
        // 印地语本地化排序器,同分类下印地语内容按本地习惯排序
        Collator hindiCollator = Collator.getInstance(new Locale("hi", "IN"));
        
        testList.sort((a, b) -> {
            int weightA = calcWeight(a);
            int weightB = calcWeight(b);
            // 不同分类先按权重排
            if (weightA != weightB) {
                return Integer.compare(weightA, weightB);
            }
            // 同分类内容:印地语用本地排序规则,其余按自然顺序排
            if (weightA == WEIGHT_HINDI) {
                return hindiCollator.compare(a, b);
            }
            return a.compareTo(b);
        });

        // 输出结果:[अभिवादन, !@#, 12dhs, hindi]
        System.out.println(testList);
    }
}

可调整点

  • 如果需要调整不同类型内容的排序顺序,直接修改对应权重常量的数值即可
  • 同分类下的排序规则可以自定义,比如数字开头内容想按提取的数值大小排序,只要替换同权重分支的比较逻辑就行
  • 特殊字符的判定范围可以按需调整,比如要把部分符号归到其他分类,直接修改calcWeight里的判断分支即可

内容的提问来源于stack exchange,提问作者Ompal Singh Deora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:06:21