Вы можете посмотреть на эту статью для получения дополнительной информации:
http://download-llnw.oracle.com/javase/tutorial/collections/interfaces/set.html
Как уже было сказано, removeAll()
делается для этого, но вы хотите сделать это дважды, так что вы можете создать список всех, которые отсутствуют в обоих, и тогда вы могли бы объединить эти два результата в есть список всех различий.
Но это деструктивная операция, поэтому, если вы не хотите потерять информацию, скопируйте Set
и оперируйте ее.
UPDATE:
Оказывается, что мое предположение о том, что в массиве является неправильным, так removeAll()
не будет работать, но с требованием 5мс, depeending на количество элементов для поиска это может быть проблема.
Итак, оказалось бы, что HashMap<String, Animal>
будет лучшим вариантом, так как он быстро в поиске.
Animal - это интерфейс с по меньшей мере одним свойством, String name
. Для каждого класса, который реализует Animal
, напишите код для Equals
и hashCode
. Вы можете найти обсуждение здесь: http://www.ibm.com/developerworks/java/library/j-jtp05273.html. Таким образом, если вы хотите, чтобы хеш-значение представляло собой комбинацию типа животного и имя, тогда это будет хорошо.
Итак, основной алгоритм состоит в том, чтобы сохранить все в хэшмапах, а затем искать различия, просто получить массив ключей и выполнить поиск, чтобы увидеть, содержится ли этот ключ в другом списке, и если он не является Положите его в List<Object>
, сохранив там значение. Вы захотите сделать это дважды, поэтому, если у вас есть, по крайней мере, двухъядерный процессор, вы можете получить некоторую выгоду из того, что оба запроса выполняются в отдельных потоках, но тогда вы захотите использовать один из параллельных типов данных добавлен в JDK5, так что вам не нужно беспокоиться о синхронизации в объединенном списке различий.
Итак, я бы написал его сначала как однопоточный и тестовый, чтобы получить некоторые идеи о том, насколько он быстрее, а также сравнить его с оригинальной импликации. Затем, если вам это нужно быстрее, попробуйте использовать потоки, чтобы сравнить, есть ли увеличение скорости.
Перед проведением любой оптимизации убедитесь, что у вас есть некоторые показатели того, что у вас уже есть, чтобы вы могли сравнить и посмотреть, приведет ли одно изменение к увеличению скорости.
Если вы делаете слишком много изменений за раз, вы можете добиться значительного улучшения скорости, но другие могут привести к снижению производительности, и это не будет видно, поэтому каждое изменение должно быть одним на время.
Не теряйте другие реализации, хотя, используя модульные тесты и тестирование, возможно, по 100 раз каждый, вы можете получить представление о том, какое улучшение дает каждое изменение.
мы можем сортировать массивы? – 2010-08-01 01:24:02
@ Функциональный - Да. – 2010-08-01 01:33:57
Во избежание дальнейших недоразумений вы можете исправить свой пример и не иметь их в качестве объектов, иначе мы столкнемся с проблемами с решениями, так как тогда вам нужно будет сравнить что-то в каждом объекте, чтобы убедиться, что они равны, поскольку новый Cat() == new Cat() = false, поскольку они представляют собой два разных объекта. –