2011-12-21 22 views
0

我需要使用Set接口的實現來存儲MyObject類型的對象。Java set add添加一個自定義添加impl

MyObject有兩個字段:idscore。對於MyObject上的平等,僅使用id。我需要使用的功能之一是能夠支持能夠添加score s當兩個MyObject s(與相同的id 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); 

我想容器有Myobject(12,0.445)但它是一組,容器都有MyObject(12, 0.1)

有什麼我可以使用哪些會給我什麼,我正在尋找?

回答

0

更改代碼/類按照下面的語義

if(container.contains(newObj)) 
{ 
    MyObject oriiginalObj = container.get(newObj); 
    originalObj.incrementScore(newObj.getScore()); 
} 

這樣做有像延長TreeSet中並重寫add()方法或通過代表團的其他方式(建議使用Guava's forwarding collection),但解決方案我提供的是簡單而明確的。

更正:使用樹形圖來代替TreeSet的托馬斯

的建議
+0

直接使用地圖的'Set'一直沒有得到' ()'方法。 –

+0

@Thomas thx評論。我沒有注意到它是TreeSet。 –

1

您應該使用這個Map:在容器上

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

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

然後就可以調用get查看對象是否已經存在,並增加其分數。

A Set不適用於您,因爲沒有從集合中獲取obj1的有效方法。

0

的時候,TreeSet實現add方法看起來像這樣

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

如果存在的話是用來指示對象加入已經存在的虛擬對象。 你可以繼承TreeSet的使用得分總和,而不是一個虛擬對象的

或者,如果可能的話,擺脫了完全設置,而是作爲@Thomas說