Итак, о том, как сделать это правильно:
Ваши объекты Customer должны иметь метод equals () и hashCode () , который выполняет сравнение. (Или у вас просто будет только один объект Customer для каждого клиента, что будет означать, что ваша модель данных должна быть скорректирована. Тогда подойдет hashCode / equals по умолчанию.)
Если у вас есть это, вы можете заменить свои три вложенных if одним:
if(customers.get(i).equals(customers.get(j)) {
customers.remove(j);
}
Это еще не решило бы вашу проблему, но упростило бы более четкое ее рассмотрение. Если
вы посмотрите, какие объекты сравниваются с какими другими, вы увидите, что после каждого удаления
объекта из списка, следующий имеет тот же индекс, что и тот, который вы только что удалили,
и вы не будете сравнивать текущий объект с ним. Как сказано, j--
после удаления решит это.
Более производительным решением было бы использование набора (который гарантированно не содержит дубликатов).
В вашем случае, HashSet<Customer>
или LinkedHashSet<Customer>
(если вы заботитесь о заказе)
все будет хорошо.
Тогда весь ваш код сводится к следующему:
Set<Customer> customerSet = new HashSet<Customer>();
for(Account acc : accounts){
customerSet.add(acc.getCustomer());
}
List<Customer> customers = new ArrayList<Customer>(customerSet);
Если вам действительно не нужен список (то есть индексированный доступ), пропустите последнюю строку и просто
используйте вместо этого набор.