You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按LocalTime升序排序对象集合?遇UnsupportedOperationException异常

问题原因

HashMap.values() 返回的是与原HashMap绑定的视图集合,它仅作为原Map值的"镜像"存在,不支持 clear()、addAll() 这类直接修改集合的操作——所有对该集合的变更必须通过原HashMap完成,直接操作视图集合会抛出 UnsupportedOperationException。

而你尝试用ArrayList替代时,ArrayList是原values集合的拷贝,它和原HashMap完全独立,自然无法同步原Map的后续变更。


解决方案

根据你的需求场景,分两种处理方式:

场景1:仅临时获取排序结果(无需修改原Map)

如果只是需要拿到排序后的City列表,不需要原HashMap保持有序,直接返回排序后的List即可:

public List<City> getSortedCitiesByDepartureTime() {
    List<City> sortedList = new ArrayList<>(cityCollection);
    // 简化Comparator写法,无需内部类
    sortedList.sort(Comparator.comparing(City::getCurrentTime));
    return sortedList;
}

后续需要排序结果时调用这个方法,原HashMap的结构不受影响。

场景2:让原Map保持排序后的顺序(同步更新)

因为HashMap本身是无序的,想要values集合既有序又和原Map同步,需要将HashMap替换为LinkedHashMap(它会维护元素的插入顺序),然后重新插入排序后的元素:

第一步:修改集合定义

// 替换为LinkedHashMap,维护插入顺序
private final Map<Integer, City> cityHashMap = new LinkedHashMap<>();
private final Collection<City> cityCollection = cityHashMap.values();

第二步:修改排序方法

public void sortByDepartureTime() {
    List<City> sortedList = new ArrayList<>(cityCollection);
    sortedList.sort(Comparator.comparing(City::getCurrentTime));

    // 通过原Map完成变更:清空后按排序顺序重新插入
    cityHashMap.clear();
    for (City city : sortedList) {
        // 假设City类有获取对应key的方法(比如getId())
        cityHashMap.put(city.getId(), city);
    }
}

此时cityCollection作为LinkedHashMap的values视图,会和原Map实时同步,且始终保持排序后的顺序。


内容的提问来源于stack exchange,提问作者nslo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:06:13