Есть ли какой-нибудь лучший способ, чем просто циклически просмотреть и вручную сравнить два поля для каждого объекта, а затем разбить их при обнаружении? Это просто кажется грязным, в поисках лучшего пути.
Если вас беспокоит ремонтопригодность, вы можете сделать то, что Фабиан Стиг предложит (это то, что я бы сделал), хотя это, вероятно, не "самый эффективный" (потому что сначала нужно отсортировать массив, а затем выполнить бинарный поиск) но, конечно, самый чистый и лучший вариант.
Если вы действительно обеспокоены эффективностью, вы можете создать собственную реализацию List, которая использует поле в вашем объекте в качестве хэша и использовать HashMap в качестве хранилища. Но, вероятно, это было бы слишком много.
Затем вам нужно изменить место, где вы заполняете данные из ArrayList на YourCustomList.
Как:
List list = new ArrayList();
fillFromSoap( list );
Кому:
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, которого, вероятно, у вас нет. Вместо этого вы используете в качестве хеша «то поле, которое вы знаете», которое делает один объект равным другому.
Конечно, реализация List с нуля намного сложнее, чем мой фрагмент выше, поэтому я говорю, что предложение Fabian Steeg было бы лучше и проще реализовать (хотя что-то подобное было бы более эффективным)
Расскажите нам, что вы сделали в конце.