3
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我希望set从中减去参数的 s)转换为 HashSet 以使用克隆,它应该返回一个浅拷贝,然后我可以从中删除set而不影响AllDataObjects.

你觉得这合适吗?

4

3 回答 3

12

创建一个新集合并将要克隆的集合作为参数。这避免了强制转换,因此您不会丢失泛型。

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

还值得注意的是,您应该使用 Set 而不是 HashSet 作为参数,以免给客户带来过多负担。

于 2008-12-26T19:00:26.723 回答
1

知道这些集合是由关系查询填充的,我建议您至少权衡编写更好的 SQL 查询以获得您想要的东西,而不是在内存中执行它。有几个原因。首先,大多数关系数据库都经过优化,可以比您的代码更有效地执行此操作。其次,您要让运行关系数据库的服务器完成它原本打算做的更多工作。第三,如果集合的大小变得很大,您将不得不带回结果,为它们分配内存,然后丢弃不需要的结果,从而给中间层带来不必要的负担。

于 2008-12-27T14:18:56.057 回答
1

如果必须,我认为此链接有更好的方法来编写该方法:

Java:有没有一种简单、快速的方法来对集合进行 AND、OR 或 XOR?

于 2008-12-27T14:20:27.457 回答