【问题标题】:Android compare special lettersAndroid比较特殊字母
【发布时间】:2012-03-11 17:51:16
【问题描述】:

有没有办法在 Android 中正确排序国际字符串?我使用自定义比较器和compareTo() 方法,但这对我来说还不够。我希望像“ö”这样的字母显示在“o”附近,但它们都在列表的末尾。如何强制比较器认为它们类似于“o、a 等……”?

【问题讨论】:

    标签: java android sorting comparator


    【解决方案1】:

    要区分区域设置的字符串comaprision,请使用Collator。来自文档:

    执行区分区域设置的字符串比较。一个具体的子类, RuleBasedCollat​​or,允许通过以下方式自定义排序规则 规则集的使用。

    字符串比较示例:

     Collator deCollator = Collator.getInstance(Locale.GERMANY); // or new Locale("pl", "PL") for polish locale ;)
     System.out.println(deCollator.compare("abcö", "abco"));
    

    打印1


    如果你想使用上面的整理器对字符串列表进行排序,你可以这样写:

    final List<String> strings = Arrays.asList(
            "über", "zahlen", "können", "kreativ", "Äther", "Österreich");
    Collections.sort(strings, deCollator); // Collator implements Comparator
    System.out.println(strings);
    

    打印:

    [Äther, können, kreativ, Österreich, über, zahlen]
    

    编辑:刚刚发现你是波兰人,所以下面是波兰语示例:

    final List<String> strings = Arrays.asList(
            "pięć", "piec", "Pieczka", "pięść", "pieczęć", "pieczątka");
    Collections.sort(strings, Collator.getInstance(new Locale("pl", "PL")));
    System.out.println(strings);
    // output: [piec, pieczątka, pieczęć, Pieczka, pięć, pięść]
    

    【讨论】:

    • 感谢您的精彩回答! ;) 实际上,我找到了更简单的解决方案:Collator collator = Collator.getInstance(); collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION); collator.compare(one, two) 这里的第二个示例显示了CANONICAL_DECOMPOSITION 规则的作用:developer.android.com/reference/java/text/Collator.html
    • 当心,Collator.getInstance() 没有明确的Locale 是环境相关的:它返回一个适合用户的默认语言环境的 Collat​​or 实例。请参阅“Be wary of the default locale”。
    • 感谢您的警告,但我现在有疑问。我只需要排序数据来显示给用户,而不是将其发送到某个地方或计算某些东西......所以可能默认语言环境就足够了吗?但是,如果我想正确排序德语和丹麦字符并将它们用作机器输出,那么最好的选择是使用Local.US locale?
    • 更新!毕竟使用明确的Locale 很好!当我将手机的语言环境更改为德语时,它省略了特殊字符,所以 CANNONICAL_DECOMPOSITION 是不够的,你是对的!
    【解决方案2】:

    除了分解策略之外,整理者还应该有一个强度集:

    final Collator collator = Collator.getInstance();
    collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
    collator.setStrength(Collator.SECONDARY);
    

    需要Collator.CANONICAL_DECOMPOSITIONCollator.SECONDARY 强度才能对重音/变音符号进行排序;如果您想对基于 unicode 的字符进行排序,则完全分解会很有帮助;但这会减慢排序速度并需要更多内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-02
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      相关资源
      最近更新 更多