webentwicklung-frage-antwort-db.com.de

Java Vergleichen Sie die Objektwerte von Two List?

Ich habe zwei Listen * *ListA<MyData> listA = new ArrayList<MyData>() ** undListB<MyData> listB = new ArrayList<MyData>()beide enthalten Objekte vom Typ MyData und MyData enthalten diese Variablen.

MyData {
    String name;
    boolean check;
} 

ListA und ListB enthalten beide MyData-Objekte. Jetzt muss ich beide Objektwerte der Liste hier vergleichen. name als auch check variable, wenn ListA diese Objektwerte enthält 

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

und ListB enthalten auch 

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

dann muss ich Listen vergleichen und false zurückgeben, da beide Listen gleich sind Aber wenn ListA enthält

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

und ListB Contain

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

dann muss ich Listen vergleichen und true zurückgeben, da beide Listen nicht identisch sind 

oder umgekehrt, also jede geringfügige Änderung der Listenwerte muss ich als wahr zurückgeben. _.Eine Sache, die ich hier erwähnen muss, Objekte können in beliebiger Reihenfolge sein.

34
user2309806

Ich habe diese Lösung für das obige Problem bekommen 

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; 

    }

BEARBEITET: -  
Wie können wir das abdecken ....__ Stellen Sie sich vor, Sie hätten zwei Arrays "A", wahres "B", wahres "C", wahr und "A", wahres "B", wahres "D", wahr. Obwohl Array eins C hat und Array zwei D hat, gibt es keine Prüfung, die das einfängt (Mendeded von @Patashu) .. SO für die, die ich unten vorgenommene Änderungen vorgenommen habe.

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

Es ist nicht die effizienteste Lösung, aber der strengste Code wäre:

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

Aktualisieren:

@WesleyPorter hat recht. Die Lösung oben funktioniert nicht, wenn sich doppelte Objekte in der Auflistung befinden.
Für eine vollständige Lösung müssen Sie eine Sammlung durchlaufen, damit doppelte Objekte korrekt verarbeitet werden.

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

Update vom 28.10.2014:

@RoeeGavriel hat recht. Die return-Anweisung muss bedingt sein. Der obige Code wird aktualisiert.

38
Oded Peer

ArrayList unterstützt dies bereits mit der equals-Methode. Zitieren die Dokumente

... Mit anderen Worten, zwei Listen werden als gleich definiert, wenn sie dieselben Elemente in derselben Reihenfolge enthalten.

Sie müssen equals ordnungsgemäß in Ihrer MyData-Klasse implementieren.

Bearbeiten 

Sie haben die Frage aktualisiert, dass die Listen unterschiedliche Reihenfolge haben können. In diesem Fall sortieren Sie zuerst Ihre Liste und wenden Sie dann gleich an.

12
NilsH

Implementieren Sie zunächst die Methoden MyData.equals(Object o) und MyData.hashCode() . Sobald Sie die Methode equals implementiert haben, können Sie die Listen wie folgt durchlaufen:

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

Verwenden von Java 8 removeIf zum Vergleichen ähnlicher Elemente

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

Sehen Sie, ob dies funktioniert.

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

Ich habe ein sehr einfaches Beispiel für den Listenvergleich unter List Compare .__ gefunden. Dieses Beispiel überprüft zuerst die Größe und prüft dann die Verfügbarkeit des jeweiligen Elements einer Liste in einer anderen.

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

return myData1.equals(myData2);

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

Der Vergleich des Strings hat für mich funktioniert. Außerdem wurde die toString () - Methode in der MyData-Klasse überschrieben.

0
abc123

Ich denke, Sie können beide Listen sortieren und in Liste konvertieren, wenn einige von ihnen ein HashSet-Colleciton waren.

Java.utils.Collections package lässt Sie das tun.

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

Ich weiß, es ist eine alte Frage, aber falls jemand sie braucht. Ich verwende dies in meiner Anwendung und es funktioniert gut. Ich überprüfte, ob der Einkaufswagen geändert wurde oder nicht. 

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

Überschreiben Sie die Methode equals in Ihrer Klasse, und verwenden Sie die Methode Collection # equals () , um die Gleichheit zu prüfen.

0
NINCOMPOOP

Seitdem sind ungefähr fünf Jahre vergangen und zum Glück haben wir jetzt Kotlin.
Das Vergleichen von zwei Listen sieht jetzt so einfach aus:

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

Oder Sie können es einfach weglassen und den Gleichheitsoperator verwenden.

0
Leo Droidcoder

Logik sollte so etwas sein:

  1. Erster Schritt: Für die Klasse MyData-Implementierung der Comparable-Schnittstelle überschreiben Sie die compareTo-Methode gemäß der Anforderung pro Objekt.

  2. Zweiter Schritt: Wenn es sich um einen Listenvergleich handelt (nach dem Überprüfen auf Nullwerte), 2.1 Überprüfen Sie die Größe beider Listen über Elemente aus beiden Listen und etwas wie aufrufen, 

    listA.get (i) .compareTo (listB.get (i))

Dies wird gemäß dem in Schritt 1 erwähnten Code sein.

0

Mit CollectionUtils.subtract können Sie eine Liste von der anderen subtrahieren. Wenn das Ergebnis eine leere Sammlung ist, bedeutet dies, dass beide Listen gleich sind. Ein anderer Ansatz ist die Verwendung von CollectionUtils.isSubCollection oder CollectionUtils.isProperSubCollection.

In jedem Fall sollten Sie für Ihr Objekt die Methoden equals und hashCode implementieren.