2011-03-22 69 views
3

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 
+0

我认为这个文档是错误的:-(排序,破坏集合可能是我最不喜欢的东西... groovy ... – 2011-03-22 15:49:15

+2

添加到JIRA http://jira.codehaus.org/browse/GROOVY-4742 – 2011-03-22 15:55:46

+0

感谢蒂姆,我已经将上面的代码添加到问题 – 2011-03-22 16:24:13

回答

2

的文档状态:

如果集合是一个列表,它是 整理到位,并返回。 否则,首先将元素放置到一个新列表中,然后 排序并返回 - 保持原始集合不变。

这反映在排序()方法

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

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

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