2016-01-28 1 views
1

У меня есть два списка List listOne, List listTwo, и я хочу сравнить оба, и если оба они одинаковые, я хочу добавить элемент списка в какой-то другой список ol1 else add to ol2.Как сравнить два списка в java

Здесь ElementRangeIndex является классом bean, который содержит некоторые строковые значения.

При сравнении двух списков необходимо сравнить каждое строковое значение с компонентом.

Я использовал приведенный ниже код, но содержит добавление повторяющихся значений, так как оба списка имеют разные объекты.

public static Map<Integer, List<ElementRangeIndex>> compareLists(List<ElementRangeIndex> listOne, List<ElementRangeIndex> listTwo) { 
    boolean indicator = false; 
    List<ElementRangeIndex> listOnes = new ArrayList<ElementRangeIndex>(); 

    List<ElementRangeIndex> listTwos = new ArrayList<ElementRangeIndex>(); 
    List<ElementRangeIndex> listThree = new ArrayList<ElementRangeIndex>(); 

    Map<Integer, List<ElementRangeIndex>> map = new HashMap<Integer, List<ElementRangeIndex>>(); 
    if (listOne!= null && listTwo!=null && listOne.size() == listTwo.size()) { 

     for (ElementRangeIndex listTwoData : listTwo) { 
      for (ElementRangeIndex listOneData : listOne) { 
/* if (listOneData.getNamespaceUri().equals(listTwoData.getNamespaceUri()) 
         && listOneData.getCollation().equals(listTwoData.getCollation()) 
         && listOneData.getScalarType().equals(listTwoData.getScalarType()) 
         && listOneData.getLocalname().equals(listTwoData.getLocalname())) {*/ 
       if ((listOneData.getNamespaceUri().hashCode()== listTwoData.getNamespaceUri().hashCode()) 
         && (listOneData.getCollation().hashCode() == listTwoData.getCollation().hashCode()) 
         && (listOneData.getScalarType().hashCode() == listTwoData.getScalarType().hashCode()) 
         && (listOneData.getLocalname().hashCode() == listTwoData.getLocalname().hashCode())) { 

        listOnes.add(listOneData); 

        if(listTwos.contains(listOneData)) 
         listTwos.remove(listOneData); 

        if(listTwos.contains(listTwoData)) 
         listTwos.remove(listTwoData); 

        if(listThree.contains(listOneData)) 
         listThree.remove(listOneData); 

        if(listThree.contains(listTwoData)) 
         listThree.remove(listTwoData); 


       }else{ 
         if(!listOnes.contains(listOneData)) 
         if(!listTwos.contains(listOneData)) 
           listTwos.add(listOneData); 
        if(!listOnes.contains(listTwoData)) 
         if(!listThree.contains(listTwoData)) 
           listThree.add(listTwoData); 

       } 

      } 
      } 
     map.put(1,listOnes); 
     map.put(2, listTwos); 
     map.put(3, listThree); 

     } 
    return map; 
} 

Моя цель состоит в том, чтобы добавить аналогичные элементы списка в один список (listOnes), осталось только другим (список listTwos) и право на другой список (listThree).

Спасибо, Арджун

+0

Используйте класс коллекций Apache Commons 'CollectionUtils', который предоставляет методы для извлечения элементов, содержащихся в обеих коллекциях или только в одном. Используйте «LinkedHashSet» или что-то подобное, чтобы сохранить порядок вставки при отклонении дубликатов (если вам это нужно). – Thomas

+0

http://stackoverflow.com/questions/2762093/java-compare-two-lists –

ответ

0

Если вам нужно сделать Раскол себя, я бы, вероятно, сделать что-то вроде этого:

  1. Создать копию списка и назовите его leftOnly. Это будет содержать элементы, присутствующие только в первом списке.

  2. Создайте копию списка два и укажите, если rightOnly. Это будет содержать элементы, только присутствующие в списке два.

  3. Создайте пустой список intersectList, который будет содержать элементы, присутствующие в обоих списках.

  4. До сих пор leftOnly может содержать слишком много элементов, поэтому нам необходимо их отфильтровать. Для этого мы используем итератор для итерации по каждому элементу и проверяем, содержится ли он в rightOnly. Если мы удалим элемент из leftOnly и rightOnly и добавим его в intersectList.

Чтобы ускорить этот процесс (contains и remove в списках являются линейными операциями), вы можете сделать leftOnly и rightOny быть типа LinkedHashSet что позволяет быстрее операции, но не позволили бы дублирует (используя дубликаты в результате сломается вся логика в любом случае).