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
相关产品推荐
相关产品推荐

