Java:对不可修改的列表进行排序

时间:2009-11-25 15:08:55

标签: java list sorting collections

如何做到这一点?

我尝试创建一个新的空列表,然后将不可修改的列表元素复制到它,但是我得到了不支持的操作错误。

感谢任何帮助。

6 个答案:

答案 0 :(得分:39)

FWIW,google-collections这是一个单行:

List<Foo> sorted = Ordering.natural().sortedCopy(unmodifiableList);

答案 1 :(得分:35)

    List unmodifiableList = Collections.unmodifiableList(list);

    List newList = new ArrayList(unmodifiableList);

    Collections.sort(newList);

ArrayList的构造函数接受现有列表,读取其元素(不修改它们!),并将它们添加到新列表中。

答案 2 :(得分:21)

您是否使用Collections.emptyList()创建空列表?如果是这样,那也是一个不可修改的列表,这可能是你问题的根源。

使用List实现的构造函数创建新列表,例如new ArrayList()。您可以将原始列表传递给构造函数,也可以使用addAll()方法。

答案 3 :(得分:12)

在Java 8中,您可以使用流API。例如:

List<?> sortedList = unsortedList.stream().sorted().collect(Collectors.toList());

答案 4 :(得分:0)

它应该如所描述的那样工作。不可修改列表中的元素本身不可修改。当然,您无法对不可修改的List进行排序,因为它必须使用添加和删除操作进行重写,并且不允许这样做。

猜错误是在其他地方,最好是显示你的代码:)

答案 5 :(得分:0)

我会回答你的第二个问题:

您无法添加到'taskListModifiable'列表中,因为这是一个'不可修改的'列表,在Java中表示它是不可变的。不能以任何方式直接更改不可修改/不可变的列表或任何类型的集合 - 您不能向其添加元素,从中删除元素或更改对现有元素的引用。

请注意,如果列表/集合中的现有元素本身是可变的,则可能会更改这些元素,但无法更改列表/集合中对它们的引用。也就是说,在列表完全超出范围并进行垃圾回收之前,不可修改的列表将始终包含相同的引用。

现在,在您的情况下,Collections.emptyList()返回一个不可修改的 EMPTY 列表。这实际上总是相同的实例,因为它是不可变的并且总是空的。由于无法扩展(添加到)不可变列表的规则,您无法添加它。由于它是空的,因此也没有任何东西可以改变。

我应该添加以使得更清楚的是Collection.emptyList()不会创建一个空列表。它只返回对单例列表实例的引用。