如何在Java中编辑Set中的特定元素,其中该元素是List对象?

问题描述 投票:0回答:1

我在 Java 中使用了一些使用数组列表的 ArrayList 的代码,但调用者需要返回 Set,因此我已将大部分代码转换为使用 Set。 mDetails 现在的定义如下:

Set<List<String>> mDetails = new HashSet<List<String>>();

我有这个函数需要转换为使用Set类型。

public void addField( int row, String value ) {
    this.mDetails.get(row).add( value );
}

另一个函数找到要修改的正确行,并且该函数将给定值添加为新列。如果有更直接的方法我愿意删除这个功能。我也尝试过:

this.mDetails[row].add( value );

很抱歉问这个问题,但互联网假设您在问这个问题时询问的是 JDBC 结果集。

java set
1个回答
1
投票

没有办法

A

HashSet
通过其 哈希码 跟踪集合中的每个元素。这意味着放置在该集合中的元素永远不会产生不同的哈希码,这一点至关重要。

HashSet
对象中的每个元素都是一个
List
对象。
List
实现如何生成其哈希码?通过覆盖
Object#hashCode
,如记录的 其 Javadoc 所示。该文档解释说,列表的哈希码是根据其每个元素的哈希码计算得出的。这意味着 List
 中的 👉🏽 
a
HashSet
绝不能被突变
(添加、删除、替换或更改其元素)。

您在

List
中改变
HashSet
元素的目标违反了此规则,即稳定不变的哈希码的要求。

所以你的问题在技术上是毫无意义的。不得更改

List
中的
HashSet

解决方法:替换每个列表

解决方法是从

List
中撤回
HashSet
,更改
List
,然后将更改后的
List
对象添加回
HashSet
,并在其中通过新的哈希代码值对其进行跟踪。

但是您没有定义如何识别

HashSet
的任何特定元素,任何特定的
List
元素。你似乎在脑海中指出了一个索引或序数。但根据定义,
Set
,特别是
HashSet
,是没有顺序的。所以元素没有编号。
Set
的元素没有索引或序号。所以我无法编写任何示例代码。


也许您应该发布另一个问题,在其中描述您试图用这组列表解决的问题。我怀疑不同的方法可能会更好地为您服务。

© www.soinside.com 2019 - 2024. All rights reserved.