集合排序

时间:2011-03-22 15:36:55

标签: sorting collections groovy

GDK文档指出Collection.sort(Comparator comparator)不会更改它所调用的集合,但下面的代码另有说明。这是实施中的错误,文档中的错误,还是我的误解?

class ISO3LangComparator implements Comparator<Locale> {

    int compare(Locale locale1, Locale locale2) {
        locale1.ISO3Language <=> locale2.ISO3Language
    }
}

List<Locale> locales = [Locale.FRENCH, Locale.ENGLISH]
def sortedLocales = locales.sort(new ISO3LangComparator())

// This assertion fails
assert locales[0] == frenchLocale

1 个答案:

答案 0 :(得分:2)

文档说明:

  

如果Collection是List,那就是   分类到位并返回。   否则,元素是第一个   然后放入一个新的列表   排序和退回 - 离开   原版收藏不变。

反映在sort()方法的实现中

public static <T> List<T> sort(Collection<T> self, Comparator<T> comparator) {
  List<T> list = asList(self);
  Collections.sort(list, comparator);
  return list;
}

asList方法查看给定集合是否是java.util.List的实例。如果是,则返回引用,否则返回新的java.util.ArrayList实例。

因为您正在使用[]语法,所以您隐式使用了java.util.List的实例。