Есть ли лучший способ, чем просто циклически и вручную сравнивать два поля для каждого объекта, а затем, когда нарушение нашли? Это просто кажется таким грязным, ища лучший способ.
Если ваша проблема является ремонтопригодность вы могли бы сделать то, что Fabian Steeg предложить (это то, что я хотел бы сделать), хотя это, вероятно, не является «самым эффективным» (потому что у вас есть для сортировки массива, а затем выполнить бинарный файл поиск), но, безусловно, самый чистый и лучший вариант.
Если вы действительно заинтересованы в эффективности, вы можете создать пользовательскую реализацию List, которая использует поле в вашем объекте как хэш и использует HashMap в качестве хранилища. Но, вероятно, это было бы слишком много.
Затем вы должны изменить место, где вы заполняете данные из ArrayList в YourCustomList.
Как:
List list = new ArrayList();
fillFromSoap(list);
To:
List list = new MyCustomSpecialList();
fillFromSoap(list);
Реализация будет что-то вроде следующего:
class MyCustomSpecialList extends AbstractList {
private Map<Integer, YourObject> internalMap;
public boolean add(YourObject o) {
internalMap.put(o.getThatFieldYouKnow(), o);
}
public boolean contains(YourObject o) {
return internalMap.containsKey(o.getThatFieldYouKnow());
}
}
Довольно много, как HashSet, то проблема здесь HashSet полагается на хорошую реализацию метода hashCode, которого, вероятно, у вас нет. Вместо этого вы используете как хэш «это поле, которое вы знаете», которое является тем, которое делает один объект равным другому.
Конечно, реализующей список с нуля много сложнее, чем мой сниппет выше, поэтому я говорю, что Fabian Steeg предложение было бы лучше и легче реализовать (хотя что-то вроде этого было бы более эффективным)
Сообщите нам что вы сделали в конце.
«HashSet.contains() имеет постоянное время доступа, то есть O (1)» - не могли бы вы указать на доказательство? Разве это не сильно зависит от хэш-функции? Если нет, почему бы просто не сказать «Быстро на практике»? В противном случае, я думаю, вы распространяете дезинформацию (возможно, с лучшими намерениями, хотя :)) –
@Jonas Kölker: Из документации: «Этот класс предлагает постоянную производительность времени для основных операций (добавление, удаление, содержит и размер), предполагая, что хэш-функция правильно распределяет элементы среди ковшей ». –
@Jonas, в то время как неудачная реализация hashCode() приведет к медленному времени доступа, к тексту любого алгоритма (в частности, к тексту CLR (S), из которого многие структуры данных Collections построены - http://www.amazon.com/ Введение-Алгоритмы-Third-Thomas-Cormen/dp/0262033844 /) расскажут вам, что структуры данных, основанные на хэше, являются O (1) для поиска. Важно понимать, что O (1) не обозначает одноэтапный поиск, а поиск не связан с размером структуры данных. Поэтому даже при плохой hashCode() s время поиска равно O (1). Вим не распространяет никакой дезинформации, на самом деле он споткнулся. – dimo414