java - 移除元素列表在恒定时间内在 HashMap 内部
问题描述
设法解决我的问题。我没有从列表中删除,而是创建了包含列表的类,这些类还包含一个索引,我每次都会递增而不是删除第一个元素。
我正在尝试实现稳定的婚姻算法。
我有一个men = HashMap<String, List<String>
循环的地方men.keySet()
当满足某个条件时,我得到一个键,我应该使用该键删除列表的第一个元素:
int someCondition = listIWantToModify;
List<String> temp = men.get(listIWantToModify);
temp.remove(0);
men.replace(listIWantToModify, temp)
我想从 HashMap 中的一个列表中删除第一个元素。发生的事情是我得到java.util.ConcurrentModificationException
的,我猜是因为我在同一个循环中从 List 中删除和获取项目。当我调用以下代码时:
List<String> replaceWithP = men.get(currentPartner);
replaceWithP.remove(0);
men.replace(currentPartner, replaceWithP);
我尝试执行以下操作:
List<String> replaceWithP = new ArrayList<>(men.get(currentPartner));
replaceWithP.remove(0);
men.replace(currentPartner, replaceWithP);
但是算法在最坏的情况下应该是 O(n 2 ),我被告知当我创建新的 ArrayList 时它是 O(n) ,因此在最坏的情况下使我的算法为 O(n 3 )。
无论如何我可以在恒定时间内修改列表而不会出现异常,还是我需要重新考虑我的实现的整个结构?
如果是这样,我会喜欢一些关于如何做到这一点的建议。
解决方案
在第一个示例中,您根本不需要 men.replace 行。您正在直接修改地图中的列表。无需再次放入相同的列表。
推荐阅读
- android - 如何修复 Xamarin.Android 中的“[FirebaseMessaging] 无法记录事件:缺少分析库”
- highcharts - Highchart 甘特图没有重叠
- html - 如何在 CSS 中放置图片而不是视频?
- rest - 微软图形/Outlook REST;使应用程序上线/公开以供我们的客户使用的过程是什么?需要多长时间?
- ios - 如何在降压构建上运行 xcconfig
- python-3.x - 如何使用python3将值附加到列表中?
- mysql - MySQL Union 语句和计数
- dynamic - SAP HANA - 如何创建一个查看 x 日期的动态查询,为我提供 x 日期前后 2 周的所有记录?
- javascript - 如何删除 Chart.js x Axis 底线?
- php - 控制器中的 Laravel 5.8 问题试图访问数组