2015-03-26 4 views
1

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

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

Теперь я пытаюсь найти общий, необычный все элементы из этих двух списков массивов. Здесь списки массивов генерируются из полностью двух разных классов моделей, но они имеют схожие свойства.

Точное сравнение дает общую ценность, но не может найти необычные элементы из двух списков массивов, когда я ставлю это условие как «! ListA.id.equals (listB.id)».

Например:

for(CustomStation user1 : localStationLists) { 
          for(CustomStation user2 : serverStationLists) { 
           if(user1.getStationId().equals(user2.getStationId())) { 
            *//*if(!user1.getTitle().equals(user2.getTitle())) { 
             resultList.add(user1); 
            }*//* 
            //System.out.println(" EQUAL St ids : " + user1); 
            resultList.add(user2); 
           } 
           else{ 
            resultList1.add(user1); 
           } 
          } 

Так, думая ли вы, ребята, также имеют те же проблемы?

Пробовал в течение последних трех дней с различными подходами, но неоднократно терпел неудачу, чтобы получить решение.

+3

код пожалуйста .. !!! ! –

+0

@PrerakSola добавленный образец код. Пожалуйста, дайте некоторое правильное руководство. – MaxGreen

ответ

0

Я не проверял этот код, но вы можете попробовать это:

for(CustomStation user1 : localStationLists) 
{ 
    boolean flag = false; 
    for(CustomStation user2 : serverStationLists) 
    { 
     if(user1.getStationId().equals(user2.getStationId())) 
     { 
      if(!user1.getTitle().equals(user2.getTitle())) 
      { 
       resultList.add(user1); 
      }    
      resultList.add(user2); 
      flag = true; 
      break; 
     } 
    } 

    if(flag == false) 
    { 
     resultList1.add(user1); 
    } 
} 
+0

Он даст мне неравный список данных? – MaxGreen

+0

'resultList1' должен иметь не равные данные. –

+0

ваш ответ дает мне некоторую идею. Пока это выглядит хорошо для меня. Для дальнейшей проблемы, как я могу связаться с вами? – MaxGreen

5

Они чувствуют себя как операции со мной: объединение, совпадение и различие.

Посмотрите на это:

Classical set operations for java.util.Collection

отлично работает для меня. Вот код:

import java.util.ArrayList; 
import java.util.List; 

/** 
* Add something descriptive here. 
* User: mduffy 
* Date: 3/26/2015 
* Time: 1:27 PM 
* @link https://stackoverflow.com/questions/29284061/find-the-uncommon-common-all-elements-from-two-different-array-list-objects-in/29284162?noredirect=1#comment46767251_29284162 
*/ 
public class SetOperationDemo { 

    public static void main(String[] args) { 
     List<String> setOne = new ArrayList<String>() {{ 
      add("A"); 
      add("B"); 
      add("C"); 
      add("D"); 
      add("E"); 
     }}; 
     List<String> setTwo = new ArrayList<String>() {{ 
      add("D"); 
      add("E"); 
      add("F"); 
      add("G"); 
     }}; 

     System.out.println("Set A   : " + setOne); 
     System.out.println("Set B   : " + setTwo); 
     List<String> base = new ArrayList<String>(setOne); 
     base.retainAll(setTwo); 
     System.out.println("Intersection A+B: " + base); 
     base = new ArrayList<String>(setOne); 
     base.removeAll(setTwo); 
     System.out.println("Subtraction A-B: " + base); 
     base = new ArrayList<String>(setTwo); 
     base.removeAll(setOne); 
     System.out.println("Subtraction B-A: " + base); 
     base = new ArrayList<String>(setOne); 
     base.addAll(setTwo); 
     System.out.println("Union A union B : " + base); 
    } 
} 

Вот вывод:

Set A   : [A, B, C, D, E] 
Set B   : [D, E, F, G] 
Intersection A+B: [D, E] 
Subtraction A-B: [A, B, C] 
Subtraction B-A: [F, G] 
Union A union B : [A, B, C, D, E, D, E, F, G] 

Process finished with exit code 0 

Если списки содержат пользовательские классы, вы должны быть уверены, что они переопределяют равных и хэш-код правильно или они не дадут ожидаемого поведения , Вот мой код, используя пользовательский класс, который показывает, как это делается.

import java.util.ArrayList; 
import java.util.List; 

/** 
* Add something descriptive here. 
* User: mduffy 
* Date: 3/26/2015 
* Time: 1:27 PM 
* @link https://stackoverflow.com/questions/29284061/find-the-uncommon-common-all-elements-from-two-different-array-list-objects-in/29284162?noredirect=1#comment46767251_29284162 
*/ 
public class SetOperationDemo { 

    public static void main(String[] args) { 
     List<DemoPerson> setOne = new ArrayList<DemoPerson>() {{ 
      add(new DemoPerson("Andy", "A")); 
      add(new DemoPerson("Bob", "B")); 
      add(new DemoPerson("Carl", "C")); 
      add(new DemoPerson("David", "D")); 
      add(new DemoPerson("Ernie", "E")); 
     }}; 
     List<DemoPerson> setTwo = new ArrayList<DemoPerson>() {{ 
      add(new DemoPerson("David", "D")); 
      add(new DemoPerson("Ernie", "E")); 
      add(new DemoPerson("Frank", "F")); 
      add(new DemoPerson("Gary", "G")); 
     }}; 

     System.out.println("Set A   : " + setOne); 
     System.out.println("Set B   : " + setTwo); 
     List<DemoPerson> base = new ArrayList<DemoPerson>(setOne); 
     base.retainAll(setTwo); 
     System.out.println("Intersection A+B: " + base); 
     base = new ArrayList<DemoPerson>(setOne); 
     base.removeAll(setTwo); 
     System.out.println("Subtraction A-B: " + base); 
     base = new ArrayList<DemoPerson>(setTwo); 
     base.removeAll(setOne); 
     System.out.println("Subtraction B-A: " + base); 
     base = new ArrayList<DemoPerson>(setOne); 
     base.addAll(setTwo); 
     System.out.println("Union A union B : " + base); 
    } 
} 

class DemoPerson { 
    private final String firstName; 
    private final String lastName; 

    public DemoPerson(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     DemoPerson that = (DemoPerson) o; 

     return !(firstName != null ? !firstName.equals(that.firstName) : that.firstName != null) && !(lastName != null ? !lastName.equals(that.lastName) : that.lastName != null); 

    } 

    @Override 
    public int hashCode() { 
     int result = firstName != null ? firstName.hashCode() : 0; 
     result = 31 * result + (lastName != null ? lastName.hashCode() : 0); 
     return result; 
    } 

    @Override 
    public String toString() { 
     final StringBuilder sb = new StringBuilder("{"); 
     sb.append("'").append(firstName).append('\''); 
     sb.append(" '").append(lastName).append('\''); 
     sb.append('}'); 
     return sb.toString(); 
    } 
} 

А вот выход, по-прежнему ведет себя так, как надо:

Set A   : [{'Andy' 'A'}, {'Bob' 'B'}, {'Carl' 'C'}, {'David' 'D'}, {'Ernie' 'E'}] 
Set B   : [{'David' 'D'}, {'Ernie' 'E'}, {'Frank' 'F'}, {'Gary' 'G'}] 
Intersection A+B: [{'David' 'D'}, {'Ernie' 'E'}] 
Subtraction A-B: [{'Andy' 'A'}, {'Bob' 'B'}, {'Carl' 'C'}] 
Subtraction B-A: [{'Frank' 'F'}, {'Gary' 'G'}] 
Union A union B : [{'Andy' 'A'}, {'Bob' 'B'}, {'Carl' 'C'}, {'David' 'D'}, {'Ernie' 'E'}, {'David' 'D'}, {'Ernie' 'E'}, {'Frank' 'F'}, {'Gary' 'G'}] 

Process finished with exit code 0 
+0

попробовал с набором, но не работал. – MaxGreen

+0

это не работает для двух объектов списка массивов. – MaxGreen

+0

Я просто разместил код вместе с выходом. Я знаю, что это работает. Вы запустили его и попробовали? – duffymo

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