克隆和减去集合 - 这是否有效?

时间:2008-12-26 18:57:40

标签: java collections clone set subtraction

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)转换为HashSet以使用clone,它应该返回一个浅拷贝,我然后可以移除set,而不会影响AllDataObjects

这看起来对你好吗?

3 个答案:

答案 0 :(得分:10)

创建一个新集合并将要克隆的集合作为参数。这样可以避免投射,因此不会丢失泛型。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果你必须这样做,我认为这个链接有更好的方法来编写该方法:

Java: Is there an easy, quick way to AND, OR, or XOR together sets?