Java set add 放置自定义添加实现

发布于 2024-12-22 12:36:15 字数 704 浏览 0 评论 0原文

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

MyObject 有两个字段:idscore。为了使 MyObject 相等,仅使用 id。我需要使用的功能之一是能够支持当两个 MyObject (具有相同的 id)时能够添加 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);

我希望容器具有 Myobject(12,0.445) 但它是一个集合,容器具有 MyObject(12, 0.1)

有什么我可以使用的东西可以给我我想要的东西吗?

I need to be using an implementation of Set interface for storing objects of type MyObject.

MyObject has two fields: id and score. For equality on MyObject, only id is used. One of the functionality I need to use is to be able to support to be able to add scores when two MyObjects (with same ids) are inserted into this set.

Currently, I am using TreeSet and its isn't working the way I want it to work.

    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);

I want container to have Myobject(12,0.445) but it being a set, the container has MyObject(12, 0.1).

Is there something I can use which will give me what I am looking for?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

牵你的手,一向走下去 2024-12-29 12:36:16

为此,您应该使用 Map

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

或者

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

然后您可以在容器上调用 get 来查看该对象是否已经存在,并增加其分数。

Set 对您不起作用,因为没有有效的方法从 Set 中获取 obj1

You should use a Map for this:

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

or

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

Then you can call get on the container to see if the object is already there, and increment its score.

A Set will not work for you because there is no efficient way of getting the obj1 from the Set.

爱她像谁 2024-12-29 12:36:16

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

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

还有其他方法可以执行此操作,例如扩展 TreeSet 并覆盖 add() 方法或通过委托(建议使用 Guava 的转发集合),但我提供的解决方案简单而明确。

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

Change the code/classes to follow the below semantics

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

There are other ways of doing this like extending the TreeSet and overriding the add() method or by delegation (suggest using Guava's forwarding collection) but the solution I provided is simple and explicit.

Correction: Use TreeMap instead of TreeSet as suggested by Thomas

不…忘初心 2024-12-29 12:36:16

TreeSet 实现的 add 方法如下所示

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

,其中 PRESENT 是一个虚拟对象,用于指示添加的对象已存在。
您可以对 TreeSet 进行子类化以使用分数总和而不是虚拟对象

,或者如果可能的话,完全摆脱 Set 并直接使用 Map,如 @Thomas 所说

The add method for the TreeSet implementation looks like this

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

where PRESENT is a dummy object used to indicate the object added already exists.
you could subclass TreeSet to use the score sum instead of a dummy object

or, if possible, get rid of the Set altogether and instead use directly the Map as @Thomas says

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文