2016-05-18 2 views
1

Впервые здесь, поэтому я надеюсь, что это имеет смысл!Сравнение двух объектных архаистов

У меня есть два массива объектов: l1 и l2, я хочу выполнить сравнение между этими двумя списками и получить непревзойденное значение, например, в l3. класс пользователя содержит 2 строки:

userEnteredValue 
valueReturnedFromDatabase 

сказать, l1 содержит: Java, JSF, JAXR, Foo l2 содержит: JSF, JAXR

Я мог бы запустить сравнение для сопоставления значений, но не для несоответствующие значения. Логика кажется ошибочной. Любая помощь?

Для соответствующих значений:

for(User u1 : l1) { 
    for(User u2: l2) { 
     if(u1.getUserEnteredValue().equals(u2.getValueReturnedFromDatabase())) { 
     l3.add(u1); 
     } 
} 

Но для несовпадающих, когда я говорю, не равно, вместо того, чтобы только уникальные значения я получаю все значения. Несколько подобных сообщений в Stackoverflow предлагают реализовать метод equals и hashcode в классе User. Это необходимо, так как размер моего arraylist не превышает 5-10.

+0

Не можете использовать 2 HashSets для этого и найти перекрывающиеся части с помощью этого? – selten98

ответ

1

Вы можете сделать что-то вроде этого:

for(User u1 : l1) { 
    boolean unique = true; 
    for(User u2: l2) { 
     if(u1.getUserEnteredValue().equals(u2.getValueReturnedFromDatabase())) { 
      unique = false; 
      break; 
     } 
    } 
    if(unique){ 
     l3.add(u1); 
    } 
} 
+0

Приветствия! Я использовал этот фрагмент, и он работает как шарм. – Ani

+0

@ Ани, я рад, что смогу помочь, удачи. – Titus

1

Вы можете использовать метод от java.util.ArrayList, чтобы определить, содержит ли ваш список объект.

Пример:

for(User u1:l1) { 
    if(!l2.contains(u1)) { 
     l3.add(u1); 
    } 
} 
+0

'l2.contains (u1)' не то же самое, что 'u1.getUserEnteredValue(). Equals (u2.getValueReturnedFromDatabase())' ему нужно будет переопределить 'equals' и' hashCode' в классе 'User' в порядке для того, чтобы это было правдой. – Titus

0

Давайте сделаем вашу проблему еще меньше.
У меня есть 2 массивы
l1 = [1, 2]
l2 = [2, 3]

for(int i : l1) { 
    for(int j : l2) { 
     if(i != j) { 
      l3.add(i); 
     } 
    } 
} 

Теперь давайте рассмотрим этот код.
Когда i = 1, j = 2 затем i != j i.e. 1 != 2 является истинным и 1 будет вставлен в l3.
Когда i = 1, j = 3 затем i != j i.e. 1 != 3 является истинным, а 1 снова будет вставлен в l3.
Когда i = 2, j = 2 затем i != j т.е. 2 != 2 ложно
Когда i = 2, j = 3 затем i != j т.е. 1 != 2 верно и 2 будут вставлены в l3.
Таким образом, последний массив будет l3 = [1, 2] (, если это набор или [1, 1, 2], если это список), то есть все элементы l1 будут вставлены в l2.

Чтобы получить уникальные элементы l1, вам нужно будет проверить все элементы l2 для того же элемента в l1 1 на 1, и если он не найден в полном l2, то добавьте его в l3.

rootloop: 
for(int i : l1) { 
    for(int j : l2) { 
     if(i == j) { 
      continue rootloop; 
     } 
     l3.add(i); 
    } 
} 

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

Но такие виды поиска настолько распространены, что их реализация уже дана в рамках коллекции.

for(int i : l1) { 
    if(!l2.contains(i)){ 
     l3.add(i); 
    } 
} 
+0

Благодарим вас за объяснение. Было бы хорошо, если бы я поставил пару консольных сообщений и проследил фрагмент. Надеюсь, это поможет кому-то другому. – Ani

0

Можно использовать массив соответствующих субъектов для создания непревзойденных организаций следующим образом:

User[] matchingUsers = ... 
User[] AllUsers = ... 

List<User> listOfMatchingUsers = Arrays.asList(matchingUsers); 
List<User> listOfAllUsers = Arrays.asList(allUsers); 

List<User> unmatchedUsers = listOfAllUsers.removeAll(listOfMatchingUsers); 
0

Если вы можете использовать Java 8, и вы хотели бы получить более короткий формат:

List<String> l1 = Arrays.asList("a", "b", "c"); 
List<String> l2 = Arrays.asList("b"); 

List<String> l3 = l1.stream().filter(e -> !l2.contains(e)).collect(Collectors.toList()); 
0

Я вижу много ответов, используя list.contains, я не согласен с тем, что содержит использование прямого цикла, поэтому производительность будет проблемой для больших списков O (n^2).

Вместо этого вы можете использовать карты, добавьте каждый список на карту с ключом и значением то же самое сделайте следующее:

Iterator it = map1.entrySet().iterator(); 
while (it.hasNext()) { 
    Map.Entry pair = (Map.Entry)it.next(); 
    if(map2.get(pair.getValue())!=null) { 
      list3.add(map2.get(pair.getValue())); 
    } 
} 
Смежные вопросы