Клонирование и вычитание наборов - это работает? - PullRequest
3 голосов
/ 26 декабря 2008
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 s, из которых я хочу вычесть параметр set) в HashSet, чтобы использовать клон, который предположительно возвращает поверхностную копию, которую я затем могу удалить set от не влияет AllDataObjects.

Вам это подходит?

Ответы [ 3 ]

10 голосов
/ 26 декабря 2008

Создайте новый набор и дайте тот, который будет клонирован, в качестве аргумента. Это позволяет избежать кастинга, поэтому вы не потеряете дженерики.

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 голос
/ 27 декабря 2008

Я думаю, что у этой ссылки есть лучший способ написать этот метод, если вы должны:

Java: существует ли простой и быстрый способ объединения наборов AND, OR или XOR?

1 голос
/ 27 декабря 2008

Зная, что эти наборы заполнены реляционным запросом, я бы посоветовал вам хотя бы поменять местами написание лучшего SQL-запроса, чтобы получить то, что вы хотите, а не делать это в памяти. Есть несколько причин, почему. Во-первых, большинство реляционных баз данных оптимизированы для более эффективной работы, чем ваш код. Во-вторых, вы позволяете серверу, на котором работает реляционная база данных, выполнять больше работы, для которой он предназначен. В-третьих, если размер наборов станет большим, вы будете излишне обременять средний уровень необходимостью возвращать результаты, выделять для них память, а затем выбрасывать нежелательные результаты.

...