Подтвердить что ты не робот

Простой способ сравнения 2 ArrayLists

У меня есть 2 arraylists строкового объекта.

List<String> sourceList = new ArrayList<String>();
List<String> destinationList = new ArrayList<String>();

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

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

Какой-нибудь более простой способ для достижения этого?

4b9b3361

Ответ 1

Преобразовать списки в Collection и использовать removeAll

    Collection<String> listOne = new ArrayList(Arrays.asList("a","b", "c", "d", "e", "f", "g"));
    Collection<String> listTwo = new ArrayList(Arrays.asList("a","b",  "d", "e", "f", "gg", "h"));


    List<String> sourceList = new ArrayList<String>(listOne);
    List<String> destinationList = new ArrayList<String>(listTwo);


    sourceList.removeAll( listTwo );
    destinationList.removeAll( listOne );



    System.out.println( sourceList );
    System.out.println( destinationList );

Вывод:

[c, g]
[gg, h]

[EDIT]

другой способ (более ясно)

  Collection<String> list = new ArrayList(Arrays.asList("a","b", "c", "d", "e", "f", "g"));

    List<String> sourceList = new ArrayList<String>(list);
    List<String> destinationList = new ArrayList<String>(list);

    list.add("boo");
    list.remove("b");

    sourceList.removeAll( list );
    list.removeAll( destinationList );


    System.out.println( sourceList );
    System.out.println( list );

Вывод:

[b]
[boo]

Ответ 2

Это должно проверить, совпадают ли два списка, сначала он выполняет некоторые базовые проверки (то есть нули и длины), затем сортирует и использует метод collections.equals, чтобы проверить, равны ли они.

public  boolean equalLists(List<String> a, List<String> b){     
    // Check for sizes and nulls

    if (a == null && b == null) return true;


    if ((a == null && b!= null) || (a != null && b== null) || (a.size() != b.size()))
    {
        return false;
    }

    // Sort and compare the two lists          
    Collections.sort(a);
    Collections.sort(b);      
    return a.equals(b);
}

Ответ 3

Преобразуйте List в в String и проверьте, являются ли строки одинаковыми или нет

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



/**
 * @author Rakesh KR
 *
 */
public class ListCompare {

    public static boolean compareList(List ls1,List ls2){
        return ls1.toString().contentEquals(ls2.toString())?true:false;
    }
    public static void main(String[] args) {

        ArrayList<String> one  = new ArrayList<String>();
        ArrayList<String> two  = new ArrayList<String>();

        one.add("one");
        one.add("two");
        one.add("six");

        two.add("one");
        two.add("two");
        two.add("six");

        System.out.println("Output1 :: "+compareList(one,two));

        two.add("ten");

        System.out.println("Output2 :: "+compareList(one,two));
    }
}

Ответ 4

Ответ приведен в сообщении @dku-rajkumar.

ArrayList commonList = CollectionUtils.retainAll(list1,list2);

Ответ 5

Насколько я понимаю это правильно, я считаю, что проще всего работать с 4 списками:  - Ваш источникList  - Ваш пункт назначенияList  - Удаленный элемент  - Недавно добавленныйИнтерфейс

Ответ 6

Самый простой способ - поочередно перебирать списки источников и получателей например:

List<String> newAddedElementsList = new ArrayList<String>();
List<String> removedElementsList = new ArrayList<String>();
for(String ele : sourceList){
    if(destinationList.contains(ele)){
        continue;
    }else{
        removedElementsList.add(ele);
    }
}
for(String ele : destinationList){
    if(sourceList.contains(ele)){
        continue;
    }else{
        newAddedElementsList.add(ele);
    }
}

Хотя это может быть не очень эффективно, если в ваших исходных и целевых списках много элементов, но, безусловно, проще.

Ответ 7

private int compareLists(List<String> list1, List<String> list2){
    Collections.sort(list1);
    Collections.sort(list2);

    int maxIteration = 0;
    if(list1.size() == list2.size() || list1.size() < list2.size()){
        maxIteration = list1.size();
    } else {
        maxIteration = list2.size();
    }

    for (int index = 0; index < maxIteration; index++) {
        int result = list1.get(index).compareTo(list2.get(index));
        if (result == 0) {
            continue;
        } else {
            return result;
        }
    }
    return list1.size() - list2.size();
}

Ответ 8

Если ваше требование состоит в том, чтобы поддерживать порядок вставки и проверять содержимое двух архиваторов, тогда вы должны сделать следующее:

List<String> listOne = new ArrayList<String>();
List<String> listTwo = new ArrayList<String>();

listOne.add("stack");
listOne.add("overflow");

listTwo.add("stack");
listTwo.add("overflow");

boolean result = Arrays.equals(listOne.toArray(),listTwo.toArray());

Это вернет true.

Однако, если вы измените порядок, например:

listOne.add("stack");
listOne.add("overflow");

listTwo.add("overflow");
listTwo.add("stack");

boolean result = Arrays.equals(listOne.toArray(),listTwo.toArray());

вернет false, поскольку порядок отличается.