java - 如何修改/删除 HashMap 中的两个 ArrayList 元素?

标签 java arraylist hashmap illegalstateexception concurrentmodification

描述

我有一个HashMap<ArrayLists<Integer>, <Integer>> ,类似于以下内容 ( {Key=Value} ):

{[1]=1, [3]=1, [1, 4, 6]=1, [0, 2, 3, 5, 6]=3, [6]=1}

我需要比较然后修改/删除不同 ArrayLists 中的元素(即 HashMap 中的元素),直到满足以下条件:

  1. 每个ArrayList元素仅属于一个列表,即具有最高 Value 的列表.
  2. 如果Value = 1对于包含该元素的所有列表,则 ArrayList元素属于单例列表。
  3. 如果 ArrayList变为空,则应将其从 HashMap 中删除.

因此,对于上面的示例,最终结果应如下:

{[1]=1, [4]=1, [0, 2, 3, 5, 6]=3}
<小时/>

我习惯于使用数组的数组来做这样的事情。这次有 HashMap 的功能就很实用了和ArrayList ,但我目前不习惯对这些数据类型进行更复杂的修改。我已经做了几次尝试,但不得不阻止 ConcurrentModificationExceptionIllegalStateException ,但尚未完全成功。我也有一种感觉,我的实现变得不必要的复杂,所以我非常希望看到有此类经验的人来实现。

<小时/>

关于 HashMap 的注释

我使用 HashMap 的原因(随意提出更合适的建议)是 ValueArrayList 次数的计数已“遇到”并添加到 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/

相关文章:

java - 一些测试用例满足,而另一些则不满足

Java - 如何从句子的ArrayList中获取每个单词

java - 在并发 HashMap 中重新散列期间检索

java - Ant 以自定义格式列出目录内容

java - 使用 Java Spring Controller 从表单读取值

java - 如何检查主类java中的命令参数

java - 我应该如何最好地与 Selenium Java WebDriver 中的 Flash 交互

java - 如何从另一个类调用 ArrayList 方法?

java - 无法对数组类型 char[] 调用 add(char)

jsp - 如何使用strut标签在JSP中迭代hashmap