为什么collections.sort在Java中通过比较器排序时会抛出不支持的操作异常?

Pop*_*ppy 20 java sorting collections arraylist

以下是我用于按预定义顺序对列表进行排序的代码.itemsSorted列表中提到了定义的顺序.

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;
Run Code Online (Sandbox Code Playgroud)

上面的代码抛出

Caused by: java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableList$1.set(Collections.java:1244)
    at java.util.Collections.sort(Collections.java:221)
Run Code Online (Sandbox Code Playgroud)

我不确定为什么列表是不可修改的.请帮帮我.

qqi*_*ihq 55

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

List<String> modifiableList = new ArrayList<String>(unmodifiableList);
Collections.sort(modifiableList, comparator);
Run Code Online (Sandbox Code Playgroud)

  • Arrays.asList总是可修改的.它只是不可调整大小 (2认同)
  • @qqilihq 我只是对你的观点感到好奇 - 这不是 UnsupportedOperationException 是“Collections”不良设计和破坏 SOLID 原则(即 Liskov 替换原则)的一个例子吗?在运行时之前不会出现任何中断。`Collections.sort` 只需要 `List` 接口,但它会破坏某些实现。您认为这种就地排序的做法总体上不是一个坏主意吗?更干净的方法是返回排序后的“Iterable”? (2认同)