it-roy-ru.com

Java Сравнить два значения объекта List?

У меня есть два списка * *ListA<MyData> listA = new ArrayList<MyData>() ** и ListB<MyData> listB = new ArrayList<MyData>() оба содержат объект типа MyData и MyData содержат эти переменные.

MyData {
    String name;
    boolean check;
} 

ListA и ListB оба содержат объекты MyData, теперь я должен сравнить оба значения объекта списка здесь name, а также check переменная, как если бы ListA содержал эти значения объекта 

ListA = ["Ram",true],["Hariom",true],["Shiv",true];

и ListB также содержат 

ListB = ["Ram",true],["Hariom",true],["Shiv",true];

тогда я должен сравнить списки и вернуть false, потому что оба списка одинаковы Но если ListA содержит

ListA = ["Ram",true],["Hariom",true],["Shiv",false];

и ListB Содержит

 ListB = ["Ram",true],["Hariom",true],["Shiv",true];

тогда я должен сравнить списки и вернуть истину, потому что оба списка не совпадают 

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

34
user2309806

Я получил это решение для вышеуказанной проблемы 

public boolean compareLists(List<MyData> prevList, List<MyData> modelList) {
        if (prevList.size() == modelList.size()) {
            for (MyData modelListdata : modelList) {
                for (MyData prevListdata : prevList) {
                    if (prevListdata.getName().equals(modelListdata.getName())
                            && prevListdata.isCheck() != modelListdata.isCheck()) {
                        return  true;

                    }
                }

            }
        }
        else{
            return true;
        }
        return false; 

    }

Отредактировано: -  
Как мы можем охватить это ... Представьте, что у вас есть два массива: "A", true "B", true "C", true и "A", true "B", true "D", правда. Даже если у массива один есть C, а у массива два есть D, нет никакой проверки, которая поймает это (Упомянуто @Patashu) .. ТАК для этого я внес изменения ниже.

public boolean compareLists(List<MyData> prevList, List<MyData> modelList) {
        if (prevList!= null && modelList!=null && prevList.size() == modelList.size()) {
            boolean indicator = false;
            for (MyData modelListdata : modelList) {
                for (MyData prevListdata : prevList) {
                    if (prevListdata.getName().equals(modelListdata.getName())
                            && prevListdata.isCheck() != modelListdata.isCheck()) {
                        return  true;

                    }
                    if (modelListdata.getName().equals(prevListdata.getName())) {
                        indicator = false;
                        break;
                    } else
                        indicator = true;
                }
                }

            }
        if (indicator)
            return true;
    }
        }
        else{
            return true;
        }
        return false; 

    }
5
user2309806

Это не самое эффективное решение, но самый краткий код будет:

boolean equalLists = listA.size() == listB.size() && listA.containsAll(listB);

Обновление:

@ УэслиПортер прав. Решение выше не будет работать, если дубликаты объектов находятся в коллекции.
Для полного решения необходимо выполнить итерацию по коллекции, чтобы дублированные объекты обрабатывались правильно.

private static boolean cmp( List<?> l1, List<?> l2 ) {
    // make a copy of the list so the original list is not changed, and remove() is supported
    ArrayList<?> cp = new ArrayList<>( l1 );
    for ( Object o : l2 ) {
        if ( !cp.remove( o ) ) {
            return false;
        }
    }
    return cp.isEmpty();
}

Обновление 28 октября 2014:

@ RoeeGavriel прав. Оператор возврата должен быть условным. Код выше обновляется.

38
Oded Peer

ArrayList уже поддерживает это с помощью метода equals. Цитирование документы

... Другими словами, два списка определены как равные, если они содержат одинаковые элементы в одинаковом порядке.

Это требует от вас правильной реализации equals в вашем классе MyData.

Правка 

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

12
NilsH

Во-первых, реализуйте методы MyData.equals(Object o) и MyData.hashCode() . После того, как вы реализовали метод equals, вы можете перебирать списки следующим образом:

if(ListA == null && ListB == null)
    return false;
if(ListA == null && ListB != null)
    return true;
if(ListA != null && ListB == null)
    return true;
int max = ListA.size() > ListB.size() ? ListA.size() : ListB.size();
for(int i = 0; i < max; i++) {
    myData1 = ListA.get(i);
    myData2 = ListB.get(i);
    if(!myData1.equals(myData2)) {
        return true;
    }
}
return false;
2
Amir Kost

Использование Java 8 removeIf для сравнения похожих элементов

public int getSimilarItems(){
    List<String> one = Arrays.asList("milan", "dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta");
    List<String> two = new ArrayList<>(Arrays.asList("hafil", "iga", "binga", "mike", "dingo")); //Cannot remove directly from array backed collection
    int initial = two.size();

    two.removeIf(one::contains);
    return initial - two.size();
}
1
Asanka Siriwardena

Посмотри, работает ли это.

import Java.util.ArrayList;
import Java.util.List;


public class ArrayListComparison {

    public static void main(String[] args) {
        List<MyData> list1 = new ArrayList<MyData>();
        list1.add(new MyData("Ram", true));
        list1.add(new MyData("Hariom", true));
        list1.add(new MyData("Shiv", true));
//      list1.add(new MyData("Shiv", false));
        List<MyData> list2 = new ArrayList<MyData>();
        list2.add(new MyData("Ram", true));
        list2.add(new MyData("Hariom", true));
        list2.add(new MyData("Shiv", true));

        System.out.println("Lists are equal:" + listEquals(list1, list2));
    }

    private static boolean listEquals(List<MyData> list1, List<MyData> list2) {
        if(list1.size() != list2.size())
            return true;
        for (MyData myData : list1) {
            if(!list2.contains(myData))
                return true;
        }
        return false;
    }
}

class MyData{
    String name;
    boolean check;


    public MyData(String name, boolean check) {
        super();
        this.name = name;
        this.check = check;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (check ? 1231 : 1237);
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        MyData other = (MyData) obj;
        if (check != other.check)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
} 
1
krishnakumarp

Я нашел очень простой пример сравнения списков в Сравнение списков Этот пример сначала проверяет размер, а затем проверяет наличие определенного элемента одного списка в другом.

1
Manoj Kumar
String myData1 = list1.toString();
String myData2 = list2.toString()

return myData1.equals(myData2);

where :
list1 - List<MyData>
list2 - List<MyData>

Сравнение строки работало для меня. Также обратите внимание, что я переопределил метод toString () в классе MyData.

0
abc123

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

Java.utils.Collections package позволяет вам сделать это.

List<Category> categoriesList = new ArrayList<>();
Set<Category> setList = new HashSet<>();
Collections.sort(categoriesList);
List<Category> fileCategories = new ArrayList<>(setList);
Collections.sort(fileCategories);

if(categoriesList.size() == fileCategories.size() && categoriesList.containsAll(fileCategories)) {
    //Do something
}
0
Sky Games Inc

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

private boolean validateOrderProducts(Cart cart) {
    boolean doesProductsChanged = false;
    if (originalProductsList.size() == cart.getCartItemsList().size()) {
        for (Product originalProduct : originalProductsList) {
            if (!doesProductsChanged) {
                for (Product cartProduct : cart.getCartProducts()) {
                    if (originalProduct.getId() == cartProduct.getId()) {
                        if (originalProduct.getPivot().getProductCount() != cartProduct.getCount()) {
                            doesProductsChanged = true;
                            // cart has been changed -> break from inner loop
                            break;
                        }
                    } else {
                        doesProductsChanged = false;
                    }
                }
            } else {
                // cart is already changed -> break from first loop
                break;
            }
        }
    } else {
        // some products has been added or removed (simplest case of Change)
        return true;
    }
    return doesProductsChanged;
}
0
mohnage7

Переопределите метод equals в вашем классе и используйте Collection # equals () метод для проверки на равенство.

0
NINCOMPOOP

С тех пор прошло около 5 лет, и, к счастью, сейчас у нас есть Котлин.
Сравнение двух списков теперь выглядит так же просто, как:

fun areListsEqual(list1 : List<Any>, list2 : List<Any>) : Boolean {
        return list1 == list2
}

Или просто не стесняйтесь опускать его и использовать оператор равенства.

0
Leo Droidcoder

Логика должна быть примерно такой:

  1. Первый шаг: для класса MyData реализует интерфейс Comparable, переопределите метод compareTo в соответствии с требованиями объекта.

  2. Второй шаг: когда дело доходит до сравнения списков (после проверки на нулевые значения), 2.1 Проверьте размер обоих списков, если равно равно true, иначе вернет false, продолжите к итерации объекта. 2.2. Если шаг 2.1 возвращает true, итерируйте над элементами из обоих списков и вызвать что-то вроде, 

    listA.get (я) .compareTo (listB.get (я))

Это будет в соответствии с кодом, упомянутым в шаге 1.

0
Himanshu Bhardwaj

Вы можете вычесть один список из другого, используя CollectionUtils.subtract, если результат - пустая коллекция, это означает, что оба списка одинаковы. Другой подход заключается в использовании CollectionUtils.isSubCollection или CollectionUtils.isProperSubCollection.

В любом случае вы должны реализовать методы equals и hashCode для вашего объекта.

0
Luiz Feijão Veronesi