集合排序

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

1
我认为文档有误 :-( 在Groovy中,sort破坏集合可能是我最不喜欢的事情... - tim_yates
3
已将其添加至 JIRA http://jira.codehaus.org/browse/GROOVY-4742。 - tim_yates
谢谢Tim,我已经将代码添加到问题上方。 - Dónal
@tim_yates,你有GDK源代码的网页链接吗?我想它们应该在GitHub上某个地方。这应该很容易为此提交一个补丁——只需克隆集合,然后对克隆进行排序,而不是对“this”进行排序。 - Dónal
Groovy目前在codehaus的svn下。我相信有人正在努力将其转移到git存储库,但目前你能得到的最好的是http://svn.groovy.codehaus.org/browse/groovy/trunk/groovy/groovy-core/。 - tim_yates
显示剩余3条评论
1个回答

2

文档说明:

如果集合是一个列表,它将在原地排序并返回。否则,元素首先被放入一个新列表中,然后对其进行排序并返回——原始集合保持不变。

这反映在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的一个实例。


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