首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Equivalence.wrap()来简化集合?

如何使用Equivalence.wrap()来简化集合?
EN

Stack Overflow用户
提问于 2014-12-03 18:13:12
回答 2查看 379关注 0票数 1

我肯定遗漏了一些关于Equivalence.wrap()的东西,但是下面的测试对我来说失败了--只在最后一行使用番石榴18.0。为什么?我做错了什么?我的目标是通过将等效对象添加到集合中来去重复它们。

代码语言:javascript
运行
复制
    @Test
    public void testEquivalenceWrap()
    {
        final Equivalence<Program2> eq = EquivalentIfIDsEven.INSTANCE;

        Program2 p1 = new Program2();
        p1.setId(2L);

        Program2 p2 = new Program2();
        p2.setId(4L);


        //sanity-test equivalence impl
        assertFalse(p1.equals(p2));
        assertTrue(eq.equivalent(p1, p2));
        assertTrue(eq.wrap(p1).equals(eq.wrap(p2)));

        //dedupe in set
        final Set<Equivalence.Wrapper<Program2>> set = new HashSet<>();
        set.add(eq.wrap(p1));
        set.add(eq.wrap(p2));

        assertEquals(1, set.size()); //FAIL: size == 2
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-03 18:44:37

如果您的Equivalence没有正确实现哈希,您就会得到这种行为。如果没有看到更多的代码,我就无法提出更具体的建议,但这几乎肯定是正在发生的事情。

票数 0
EN

Stack Overflow用户

发布于 2014-12-03 19:02:18

如果我是您,我尝试在您的测试中使用这个类(例如,在等效类中使用javadoc中的EqualsEquivalence ):

代码语言:javascript
运行
复制
static final class EquivalentIfIDsEven extends Equivalence<Program2>
        implements Serializable {

    static final EquivalentIfIDsEven INSTANCE = new EquivalentIfIDsEven();

    @Override protected boolean doEquivalent(Program2 a, Program2 b) {
        return a.equals(b);
    }
    @Override protected int doHash(Program2 o) {
        return o.hashCode();
    }

    private Program2 readResolve() {
        return INSTANCE;
    }
    private static final long serialVersionUID = 1;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27278750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档