Вопрос

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 для использования клона, который предположительно возвращает неглубокую копию, которую я затем могу удалить set не затрагивая AllDataObjects.

Вам это кажется правильным?

Это было полезно?

Решение

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

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

Также стоит отметить, что для параметра следует использовать Set, а не HashSet, чтобы не перегружать клиентов.

Другие советы

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

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

Джава:Есть ли простой и быстрый способ объединить множества AND, OR или XOR?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top