Клонирование и вычитание наборов – это работает?
-
23-08-2019 - |
Вопрос
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?