Java设置add以放置自定义add impl

Java设置add以放置自定义add impl,java,set,Java,Set,我需要使用Set接口的实现来存储类型为MyObject的对象 MyObject有两个字段:id和score。对于MyObject上的相等,仅使用id。我需要使用的功能之一是能够支持在将两个MyObjects(具有相同的ids)插入此集合时添加scores 目前,我正在使用TreeSet,但它的工作方式与我希望的不同 Set<MyObject> container = new TreeSet<MyObject>(); MyObject obj1 = new

我需要使用
Set
接口的实现来存储类型为
MyObject
的对象

MyObject
有两个字段:
id
score
。对于
MyObject
上的相等,仅使用
id
。我需要使用的功能之一是能够支持在将两个
MyObject
s(具有相同的
id
s)插入此集合时添加
score
s

目前,我正在使用
TreeSet
,但它的工作方式与我希望的不同

    Set<MyObject> container = new TreeSet<MyObject>();
    MyObject obj1 = new MyObject(12, 0.345);
    container.add(obj1);

    MyObject obj2 = new MyObject(12, 0.1);
    container.add(obj2);
Set container=new TreeSet();
MyObject obj1=新的MyObject(12,0.345);
container.add(obj1);
MyObject obj2=新的MyObject(12,0.1);
container.add(obj2);
我希望容器具有
Myobject(12,0.445)
,但作为一个集合,容器具有
Myobject(12,0.1)


有什么东西可以让我找到我想要的吗?

更改代码/类以遵循以下语义

if(container.contains(newObj))
{
  MyObject oriiginalObj = container.get(newObj);
  originalObj.incrementScore(newObj.getScore());
}
还有其他方法可以做到这一点,比如扩展TreeSet并重写add()方法,或者通过委托(建议使用),但是我提供的解决方案是简单而明确的


更正:按照Thomas的建议,使用TreeMap而不是TreeSet

您应该为此使用
映射:

Map<Integer, Double> container = new TreeMap<Integer, Double>();
Map container=newtreemap();

Map container=newtreemap();
然后可以在容器上调用
get
,查看对象是否已经存在,并增加其分数


Set
不适用于您,因为没有有效的方法从集合中获取
obj1

树集实现的add方法如下所示

private transient SortedMap<E,Object> m; // The backing Map
public boolean add(E o) {
return m.put(o, PRESENT)==null;
}
私有瞬态分类dmap m;//背景图
公共布尔加法(EO){
返回m.put(o,PRESENT)=null;
}
其中PRESENT是一个虚拟对象,用于指示添加的对象已存在。 您可以将TreeSet子类化,以使用分数和而不是虚拟对象

或者,如果可能的话,完全去掉集合,直接使用地图,就像@Thomas所说的那样

private transient SortedMap<E,Object> m; // The backing Map
public boolean add(E o) {
return m.put(o, PRESENT)==null;
}