private HashMap<DataObject, HashSet> AllDataObjects;

...

/** Returns all DataObject elements that are NOT in the specified set. */
private DataObject[] invert( HashSet<DataObject> set )
{
    HashSet<DataObject> keys = (HashSet) AllDataObjects.keySet();
    keys = (HashSet) keys.clone();

    keys.removeAll( set );

    return (DataObject[]) keys.toArray();
}

请注意,我不希望通过这个过程来改变AllDataObjects。我浇铸该组AllDataObjects密钥”(这是我想要的DataObject参数从减去sets)转换成一个HashSet使用克隆,据称返回一个浅拷贝,我可以然后从删除set而不影响AllDataObjects

这看起来你的权利?

有帮助吗?

解决方案

创建一组新的,并给予被克隆作为参数之一。这避免了铸造,这样你就不会失去泛型。

private DataObject[] invert( Set<DataObject> set ){
    Set<DataObject> keys = new HashSet<DataObject>(AllDataObjects.keySet());
    keys.removeAll( set );
    return keys.toArray(new DataObject[]{});
}

另外值得一提的是,你应当使用,而不是HashSet的为参数,从而不会过度负担你的客户。

其他提示

明知这些集合是由一个关系查询填充,我建议你至少权衡编写更好的SQL查询来获取你想要的东西,而不是在内存中这样做。有几个原因。首先,大多数关系型数据库进行优化,以更有效地做到这一点比你的代码。其次,你让在关系数据库运行做多,它的目的是为工作的服务器。第三,如果套的尺寸变大,你会被具有带回的结果,分配内存为他们,然后扔掉不需要的结果不必要负担的中间层。

我觉得这个环节有更好的方式来写这个方法,如果你必须:

爪哇:有一个简单,快捷的方式AND,OR,XOR或一起套

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top