为什么collections.sort在Java中按comparator排序时抛出不支持的操作异常?

为什么collections.sort在Java中按comparator排序时抛出不支持的操作异常?,java,sorting,collections,arraylist,Java,Sorting,Collections,Arraylist,下面是我用来按预定义顺序对列表排序的代码。项目列表中提到了定义的顺序 final List<String> itemsSorted = myMethod.getSortedItems(); List<String> plainItemList = myMethod2.getAllItems(); final Comparator<String> comparator = new Comparator<String>() {

下面是我用来按预定义顺序对列表排序的代码。项目列表中提到了定义的顺序

final List<String> itemsSorted = myMethod.getSortedItems();

List<String> plainItemList = myMethod2.getAllItems();

final Comparator<String> comparator = new Comparator<String>() {        

    public int compare(String str1, String str2) {
        return orderOf(str1) - orderOf(str2);
    }

    private int orderOf(String name) {          
        return ((itemsSorted)).indexOf(name);
    }
 };
 Collections.sort(plainItemList, comparator);
 return plainItemList;

我不知道为什么这个列表是不可修改的。请在这方面帮助我。

列表是不可修改的,显然您的客户端方法正在创建一个不可修改的列表(使用例如
集合#不可修改列表
等)。排序前只需创建一个可修改列表:

List<String> modifiableList = new ArrayList<String>(unmodifiableList);
Collections.sort(modifiableList, comparator);
List modifiableList=新建ArrayList(不可修改列表);
Collections.sort(可修改列表、比较器);

所以。。。
myMethod2.getAllItems()
返回什么?你需要提供足够的信息来提供帮助。我们无法看到您的代码。这取决于列表的创建方式。向我们展示
myMethod2.getAllItems()的代码。
这个集合$UnmodifiableList$1不是很响亮吗?然后Cassandra会返回一个不可修改的列表为什么是不可修改的列表?Arrays.asList始终是可修改的。它只是不可修改resizable@qqilihq我只是好奇你的观点——这个不受支持的操作异常不是一个不良的
集合设计和破坏可靠原则(即Liskov替代原则)的例子吗。在运行之前,任何东西都不会中断
Collections.sort
只需要
List
接口,而在某些实现中它会中断。你认为,这种排序方法不是一个总体上不好的主意吗?一种更干净的方法将返回排序的
Iterable
,我倾向于同意。例如,C#(afaik?)有一个显式的不可变列表类型。我认为类似的构造可以通过Java中的第三方LIB获得,但是与现有API的互操作性当然会很差。在任何情况下,
Iterable
只会使事情稍微好一点,因为
Iterator
又有一个允许修改的
remove
方法(这意味着,最后该方法必须再次抛出一个
UnsupportedOperationException
来表示它不允许修改)@qqilihq我来自于Java的一些C#背景,与C#的LINQ和基本集合相比,Java的集合接口有时感觉像是由醉汉编写的。为什么
Iterator
确实有
remove
方法?C#的
枚举器
没有。
List<String> modifiableList = new ArrayList<String>(unmodifiableList);
Collections.sort(modifiableList, comparator);