按对象的字符串字段(包括特定于语言的字符)对对象进行排序

时间:2018-09-04 14:41:04

标签: java collections

我想按其字符串名称字段对我的对象列表进行排序。但是这些名称带有一些波兰字符,因此排序不正确。我对此问题进行了一些研究,发现应该使用类似以下内容的方法:

Collections.sort(myList, Collator.getInstance());

但是问题是它仅在我尝试对字符串列表进行排序时才有效。当我尝试对我的对象列表进行排序时,我得到了java.lang.ClassCastException。 如何用波兰语字母顺序对我的对象列表进行排序?

我的对象看起来像这样:

public class MyObject implements Comparable<MyObject>{
     private String name;
     ...

     @Override
    public int compareTo(@NonNull MyObject object) {
        return name.compareTo(object.getName());
    }

现在我尝试按以下方式对其进行排序:

List<MyObject> myList = DataProvider.getInstance().getListOfObjects();    
Collections.sort(myList, Collator.getInstance());

2 个答案:

答案 0 :(得分:2)

我相信Collator documentation中有些含糊。

CollatorComparator<Object>,但它实际上是为了表演

  

区域设置敏感的字符串比较   (强调我的)。

您可以在Collator#compare具体实现的documentation中更好地看到这一点:

  

此实现仅返回compare ((String)o1, (String)o2)


您获得的ClassCastException可能是由于MyObject显然不是String


我会尝试在实际的Collator实现中转移compareTo的用法:

Collections.sort(myList);

...以及您的compareTo实施中:

Collator.getInstance().compare(name, object.getName());

请注意,Collator.getInstance()习惯用法使用默认的Locale

因此,如果您计划根据上下文使用多个Locale来比较对象,那么最好使用允许注入Comparator的自定义Locale进行排序,并使用Collator在幕后。

答案 1 :(得分:1)

Collator用于比较字符串,您可以提取名称,然后将其传递给Collator

myList.sort((o1, o2) -> Collator.getInstance().compare(o1.getName(), o2.getName()));