如何按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
相关产品推荐
相关产品推荐

