Android:如何按字母顺序对一个包含特殊字符的ArrayList进行排序?

3

我正在开发一款安卓应用程序,其中的数据是挪威语。现在,我需要按字母顺序对包含特殊挪威字符的姓名列表进行排序。

    Comparator<SetGetMethods> comperator = new Comparator<SetGetMethods>() {

        public int compare(SetGetMethods object1, SetGetMethods object2) {

                return object1.getCityname().compareToIgnoreCase(object2.getCityname());

        }

    };
    Collections.sort(temp, comperator);

我使用上面的代码按字母顺序排序列表。但是,在排序后,常规字符的名称显示在顶部,并且具有特殊挪威字符的名称显示在它们下面。例如,列表如下所示,
Arendal Bergen Drammen Ålesund -> (此应在排序前位于Arendal之前)
因此,我的问题是,如何按字母顺序排列包含特殊字符(挪威字符)的列表数据?我将感激任何解决问题的建议、想法或示例代码。谢谢......
4个回答

5
尝试这个:
针对一个对象:
class MyObject
{
  public String name;
  public int score;
}

如果你想按名称排序(在这种情况下使用挪威语),可以这样做。
Locale locale = new Locale("nb", "NO");
final Collator collator = java.text.Collator.getInstance(locale);

Collections.sort(your_array, new Comparator<MyObject>() {
    @Override
    public int compare(MyObject obj1, MyObject obj2) {
        return collator.compare(obj1.name, obj2.name);            
    }
});

谢谢!我尝试使用CollationKey对象对对象进行排序,但结果完全错误。这次按预期工作了。 - Tooroop

3

请查看基于挪威语的示例,该示例基于RuleBasedCollator类的JavaDoc

基于此,我创建了此示例,根据重音差异将Å放在A之前--请注意使用';'将\u00E5放在A之前。因此,这适用于您的示例输入,但您需要根据您对该语言的了解添加其他带重音的挪威字符以完成norwegian比较字符串。

String norwegian = "< a, \u00E5;A< b,B< c,C< d,D< e,E< f,F< g,G< h,H< i,I< j,J" +
                   "< k,K< l,L< m,M< n,N< o,O< p,P< q,Q< r,R< s,S< t,T" +
                   "< u,U< v,V< w,W< x,X< y,Y< z,Z";                      
RuleBasedCollator myNorwegian = new RuleBasedCollator(norwegian);     
List<String> words = 
  Arrays.asList("Arendal Bergen Drammen \u00E5lesund".split("\\s"));     
System.out.println(words);     
Collections.sort(words, myNorwegian);     
System.out.println(words);

我感到很困惑,因为这个类对我来说是全新的。你能否提供一些示例来帮助我理解Collator的概念,以及如何使用它来排序ArrayList。那将不胜感激。 - Junaid
1
嗨,安迪,你的例子很好用,再次感谢。现在,如果我想对一个包含多个信息(如姓名、地址等)的对象数组列表进行排序,那么如何使用这个RuleBasedCollator按字母顺序对整个数组列表进行排序,考虑到对象的“名称”信息?你有任何关于这方面的想法或建议吗? - Junaid
好的,我已经找到了解决方案,按照上面的评论,将数组列表排序为我想要的方式.... :) - Junaid
很棒的例子:现在我可以按照应该的方式对字符串进行排序。但是对于对象呢?我尝试过,但是出现了错误:<code>com.mycompany.myapp.model.MyClass无法强制转换为java.lang.String</code>。:-/ - kjoelbro

1
使用 Collator。这是一种执行区域设置敏感的字符串比较的 Comparator类型。
如果不了解挪威语言/字符,建议使用以下代码:
Collator noCollator = Collator.getInstance(new Locale("no", "NO"));
noCollator.setStrength(Collator.SECONDARY);
...

0
  Locale locale = new Locale("nb", "NO");
    final Collator collator = java.text.Collator.getInstance(locale);
    
    Collections.sort(your_array, new Comparator<MyObject>() {
        @Override
        public int compare(MyObject obj1, MyObject obj2) {
            return collator.compare(obj1.name, obj2.name);            
        }
    });

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接