为什么在Set接口上没有定义replace()方法?

Ele*_*eco 21 java

目前我必须编写以下内容来更新已包含在Set中的元素:

Set mySet= ...
Element e1 = new Element (...);
....
....
Element e2 = new Element (...);
\\e1 and e2 are different instances, but equals.

\\update the element contained into the Set
if (mySet.contains(e2)){
    mySet.remove(e2);
    myset.add(e2);
 }
Run Code Online (Sandbox Code Playgroud)

那看起来不太好看.还有其他选择吗?

pen*_*pen 16

Set是一种数据结构,通过在对象上使用equals()来避免重复; 这也意味着两个彼此等于()的对象被认为是完全等价的.即,无论您使用的是Set中的版本还是新版本,您的代码都应该相同.

如果你想用一个新值来更新对象,那么你显然不是这种情况(两个版本不能相互替换),然后你应该使用另一个数据结构(例如,一个地图,你可以很容易地覆盖该值,在这种情况下,键甚至可以是对象本身).

  • 是.我现在意识到我对equals()的定义太不精确了 - 导致某些对象比其他对象更平等;) (2认同)

Ste*_*n C 5

为什么在Set接口上没有定义replace()方法?

我可以想到三个原因:

  1. 它在功能上是多余的:set.replace(old, nu)if (set.remove(old)) { set.add(nu) }举例来说.

  2. old不存在的情况下的行为增加了复杂性.

  3. 添加replaceSetAPI会强制Set实现(冗余)方法的所有实现.

甚至可能有更深层次的原因; 例如,与replace某些模糊案例的可实施性有关.

但是,正如其他人指出的那样,您的用例根本不需要replace.您的代码具有与此相同的效果(*):

    Set myset = ...
    myset.add(element);
Run Code Online (Sandbox Code Playgroud)

(*实际上,如果您的element.equals(Object)方法逐字段地比较元素对象,您可能能够检测到差异.根据Set实现,您可能在执行两个代码序列后在集合中获得不同的对象引用.但是,IMO你会如果你对这种事情做出假设,那就要麻烦了!)