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

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

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

MyData {
    String name;
    boolean check;
} 

ListA и ListB оба содержат объекты MyData, теперь мне нужно сравнить оба значения объекта списка здесь name, а также проверить переменную, например, 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, потому что оба списка не одинаковы.

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

4b9b3361

Ответ 1

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

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; 

    }

EDITED: -
Как мы можем покрыть это... Представьте, что у вас было два массива "A", "B", "C", "true" и "A", "B", "D", true. Несмотря на то, что массив имеет C, а массив два имеет D, нет проверки, которая будет улавливать это (упоминается @Patashu).. SO для этого я сделал следующие изменения.

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; 

    }

Ответ 2

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

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

Обновление:

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

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-Oct-2014:

@RoeeGavriel прав. Оператор return должен быть условным. Обновленный код обновлен.

Ответ 3

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

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

Это требует, чтобы вы правильно реализовали equals в своем классе MyData.

Изменить

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

Ответ 4

Сначала реализуйте методы 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;

Ответ 5

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

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;
    }
} 

Ответ 6

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

Ответ 7

Использование 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();
}

Ответ 8

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

Ответ 9

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

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

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

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

Это будет соответствовать коду, указанному в шаге 1.

Ответ 10

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

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

Ответ 11

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

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

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

Ответ 12

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

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;
}

Ответ 13

String myData1 = list1.toString();
String myData2 = list2.toString()

return myData1.equals(myData2);

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

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

Ответ 14

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

Пакет java.utils.Collections позволяет вам это сделать.

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
}