描述
我有一个HashMap<ArrayLists<Integer>, <Integer>>
,类似于以下内容 ( {Key=Value}
):
{[1]=1, [3]=1, [1, 4, 6]=1, [0, 2, 3, 5, 6]=3, [6]=1}
我需要比较然后修改/删除不同 ArrayLists
中的元素(即 HashMap
中的元素),直到满足以下条件:
- 每个
ArrayList
元素仅属于一个列表,即具有最高Value
的列表. - 如果
Value = 1
对于包含该元素的所有列表,则ArrayList
元素属于单例列表。 - 如果
ArrayList
变为空,则应将其从HashMap
中删除.
因此,对于上面的示例,最终结果应如下:
{[1]=1, [4]=1, [0, 2, 3, 5, 6]=3}
<小时/>
我习惯于使用数组的数组来做这样的事情。这次有 HashMap
的功能就很实用了和ArrayList
,但我目前不习惯对这些数据类型进行更复杂的修改。我已经做了几次尝试,但不得不阻止 ConcurrentModificationException和 IllegalStateException ,但尚未完全成功。我也有一种感觉,我的实现变得不必要的复杂,所以我非常希望看到有此类经验的人来实现。
关于 HashMap
的注释
我使用 HashMap
的原因(随意提出更合适的建议)是 Value
是 ArrayList
次数的计数已“遇到”并添加到 HashMap
.
最小示例
我最近的非工作( IndexOutOfBoundsException
)尝试的最小示例。请注意,HashMap
的创建和ArrayList
s 在这里是静态完成的,因为在我的实际程序中,它是根据文件内容不确定地完成的。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<List<Integer>, Integer> example = new HashMap<>(7);
List<Integer> list = new ArrayList<>(7);
list.add(1);
example.put(list, 1);
list = new ArrayList<>(7);
list.add(3);
example.put(list, 1);
list = new ArrayList<>(7);
list.add(1);
list.add(4);
list.add(6);
example.put(list, 1);
list = new ArrayList<>(7);
list.add(0);
list.add(2);
list.add(3);
list.add(5);
list.add(6);
example.put(list, 3);
list = new ArrayList<>(7);
list.add(6);
example.put(list, 1);
System.err.println(example);
Map<List<Integer>, Integer> copy = new HashMap<>(example);
for (Map.Entry<List<Integer>, Integer> outer : example.entrySet()) {
for (Map.Entry<List<Integer>, Integer> inner : copy
.entrySet()) {
for (int i : outer.getKey()) {
int oSize = outer.getKey().size();
int iSize = inner.getKey().size();
int oValue = outer.getValue();
int iValue = inner.getValue();
if (!(inner.equals(outer)) && (inner.getKey()
.contains(i))) {
if (oSize == 1) {
if (oValue < iValue) {
outer.getKey().remove(i);
} else {
inner.getKey().remove(i);
}
} else if (iSize == 1) {
if (iValue < oValue) {
outer.getKey().remove(i);
} else {
inner.getKey().remove(i);
}
} else {
if (oValue < iValue) {
outer.getKey().remove(i);
} else {
inner.getKey().remove(i);
}
}
}
}
}
}
}
}
最佳答案
使用 ArrayList 作为 HashMap ( Are mutable hashmap keys a dangerous practice? ) 的键是非常不寻常的。 但假设您对此表示同意,要更新映射条目,您可以从 hasmap 中删除该条目(列表和整数),创建一个包含您的更改的新列表,然后在必要时重新插入。
关于java - 如何修改/删除 HashMap 中的两个 ArrayList 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58049005/