目前我必须编写以下内容来更新已包含在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中的版本还是新版本,您的代码都应该相同.
如果你想用一个新值来更新对象,那么你显然不是这种情况(两个版本不能相互替换),然后你应该使用另一个数据结构(例如,一个地图,你可以很容易地覆盖该值,在这种情况下,键甚至可以是对象本身).
为什么在Set接口上没有定义replace()方法?
我可以想到三个原因:
它在功能上是多余的:set.replace(old, nu)仅if (set.remove(old)) { set.add(nu) }举例来说.
在old不存在的情况下的行为增加了复杂性.
添加replace到SetAPI会强制Set实现(冗余)方法的所有实现.
甚至可能有更深层次的原因; 例如,与replace某些模糊案例的可实施性有关.
但是,正如其他人指出的那样,您的用例根本不需要replace.您的代码具有与此相同的效果(*):
Set myset = ...
myset.add(element);
Run Code Online (Sandbox Code Playgroud)
(*实际上,如果您的element.equals(Object)方法逐字段地比较元素对象,您可能能够检测到差异.根据Set实现,您可能在执行两个代码序列后在集合中获得不同的对象引用.但是,IMO你会如果你对这种事情做出假设,那就要麻烦了!)
| 归档时间: |
|
| 查看次数: |
14776 次 |
| 最近记录: |