2016-05-12 8 views
0

Привет У меня есть список массивов Список l1 и List l2, Имя, возраст, пол, uniqID, метки - это данные внутри списков. Я хочу присоединиться к l1 и l2 без duplicates.uniqID уникален для каждого ученика. Я перебираю все элементы и сравниваю каждый элемент. Но у моего списка было бы порядка 20 тыс. Элементов, поэтому цикл занимает слишком много времени. Я пробовал all the answers from this post ничего не работало для меня. Какие-либо предложения.?Объединение ArrayList элементов модели без дубликатов

+0

ли вы переопределить 'equals' в классе«Человек»? Удаление дубликатов, как предлагается в этом сообщении http://stackoverflow.com/a/14361428/966852, должно работать один раз, когда выполняется «equals». – samjaf

+0

@Shanu: вы можете использовать 'HashSet' или любую коллекцию, которая реализует интерфейс' set' .. !! – AndiGeeky

ответ

1

Простой пример:

public class Person{ 
    int id; 
    String name; 
    //fields, getter, setter, constructor omited.... 

    @Override 
    public boolean equals(Object o){ 
     if (!(o instanceof Person)){ 
      //implicit null check 
      return false; 
     } 
     return this.id==((Person)o).id; 
    } 

    @Override 
    public int hashCode(){ 
     return this.id; 
    } 
} 

Класс Person делает реализацию равных и хэш-код в настоящее время. equals используется java для определения того, является ли объект дубликатом другого объекта. hashCode не является само по себе, но предлагается переопределить hashCode и equals вместе.

Если оба метода реализованы, вы можете просто использовать встроенные методы и datastructures в Java:

Со списками:

List<Person> listA = new ArrayList<>(); 
List<Person> listB = new ArrayList<>(); 
// filling the lists omitted 
List<Person> mergedList=new ArrayList<>(); 
mergedList.addAll(listA); 
mergedList.removeAll(listB); 
mergedList.addAll(listB); 

Или с наборами:

List<Person> listA = new ArrayList<>(); 
List<Person> listB = new ArrayList<>(); 
// filling the lists omitted 
Set<Person> mergedSet=new HashSet<>(); 
mergedSet.addAll(listA); 
mergedSet.addAll(listB); 
+0

Я попробую это сразу. – Sreyas

+0

Это занимает около 1 минуты, хотя список устраняет все дубликаты. – Sreyas

+0

Какой пример вы использовали? Решение, использующее 'Set', должно выполняться намного лучше, чем решение, используя' List'. Если вам все еще нужен порядок списка после слияния, вы можете использовать 'LinkedHashSet'. – samjaf

0

You может объединить и арраист и передать его объекту HashSet Поскольку Set не содержит дубликатов, вы можете сделать следующее

ArrayList<String> a=new ArrayList<String>(); 
ArrayList<String> b=new ArrayList<String>(); 

b.addAll(a); 

Если вы хотите сохранить порядок элементов использовать LinkedHashSet

LinkedHashSet<String> result=new LinkedHashSet<String>(b); 
+0

объединение обоих списков и их добавление в 'Set' больше работы, чем необходимо. Вы можете просто вызвать 'addAll' оба списка в (пустой) Set. Кроме того, проблема заключается в отсутствии 'equals' и' hashCode' в пользовательском классе, который предотвратит правильную работу 'Set'. – samjaf

Смежные вопросы