当前位置: 首页 > 面试题库 >

组合两个Set时的java.lang.UnsupportedOperationException

赫连法
2023-03-14
问题内容

我有2个不同的HashMap实例

我想合并两个HashMaps的键集;

码:

Set<String> mySet = hashMap1.keySet();
mySet.addAll(hashMap2.keySet());

例外:

java.lang.UnsupportedOperationException
    at java.util.AbstractCollection.add(AbstractCollection.java:238)
    at java.util.AbstractCollection.addAll(AbstractCollection.java:322)

我没有收到编译警告或错误。

从java doc这应该工作。即使添加的集合也是集合:

boolean addAll(Collection c)

如果指定集合中的所有元素尚不存在,则将它们添加到此集合中(可选操作)。如果指定的集合也是一个集合,则addAll操作会有效地修改此集合,以使其值为两个集合的并集。如果在操作进行过程中修改了指定的集合,则此操作的行为是不确定的。


问题答案:

如果您查看该HashMap#keySet()方法的文档,将会得到答案(重点是我的)。

返回此映射中包含的键的Set视图。该集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(通过迭代器自己的remove操作除外),则迭代的结果不确定。该集合支持元素删除,该元素通过Iterator.remove,Set.remove,removeAll,retainAll和clear操作从映射中删除相应的映射。
它不支持add或addAll操作。

因此,您需要创建一个新集合并将所有元素添加到其中,而不是将元素添加到Set返回的元素上keySet()



 类似资料:
  • 问题内容: 我有两个像这样的数组: 我想结合这两个数组,使其不包含重复项,并保留其原始键。例如,输出应为: 我已经尝试过了,但是它正在更改其原始键: 有什么办法吗? 问题答案: 只需使用: 那应该解决。因为如果一个键出现多次(例如在您的示例中),则使用字符串键,因此一个键将覆盖具有相同名称的处理键。因为在您的情况下,它们两者都具有相同的值,但这无关紧要,并且还会删除重复项。 更新:我刚刚意识到,P

  • 寻找一种优雅的方式以特殊的方式合并两个散列数组: 如果名称关键字匹配,则结果必须包含< code>new_data的所有名称散列,仅包含< code>old_data的额外数据。 我的第一次尝试是这样的,但是它创建了一个额外的散列:

  • 问题内容: 我有两个数组,我想将这两个数组合并为一个数组。请查看以下详细信息: 第一个数组: 第二个数组: 我想要这个结果。有人知道该怎么做吗? 希望你理解这个问题。先感谢您。 问题答案: 已修正 (再次) 接受无限数量的输入数组,将所有子数组作为索引数组合并到一个容器中,然后返回结果。 编辑03/2014: 提高可读性和效率

  • 我只允许在我的主菜单中有4个选项,我创建了5个。我不知道如何把最后2个输出语句放在一起,这样一个语句就可以从另一个语句的内部调用。因此它们可以使用相同的菜单选项。 选项3和选项4需要以某种方式在彼此内部,这样我就可以显示输入的所有联系人的名称,然后提示用户选择联系人ID,以显示该联系人的其余详细信息。 以下是更改前的输出结果和更改后的输出结果。 这是我之前的改变,这是好的,除了我在主菜单中有太多的

  • 给定两个数组,其中数组1包含变量,数组2包含变量的值,我希望得到这两个数组的所有可能组合,例如: 数组可以容纳尽可能多的变量,也可以容纳。 所需输出: 我尝试了一种递归方法: 我希望能够将每一行正确的内容保存为中的一个元素,但首先我想知道如何正确打印每一行。 编辑:第二个数组不是常量,它在每个变量之间不同: 显然,这在递归中行不通,因为我需要将每个数组与变量数组一起发送,我通过创建一个对象来实现这

  • 我需要将另一个改装请求中的图像合并到其特定系列中。听起来很简单的任务把我带进了反应式的地狱,没有一丝希望。 具体来说,我还通过可观察创建服务,因为我需要获取身份验证令牌来创建服务。 我的尝试基于以下答案:https://stackoverflow.com/a/28418503/2192545. 我有点不知所措。我只是在Observable的Func2部分得到了“无法推断函数接口类型”。在IDE中,