it-swarm.com.de

Herausfinden, ob eine Liste von Objekten etwas mit einem bestimmten Feldwert enthält?

Ich habe eine Liste von DTOs, die von einer Datenbank erhalten wurden, und sie haben eine ID. Ich möchte sicherstellen, dass meine Liste ein Objekt mit einer angegebenen ID enthält. Anscheinend hilft das Erstellen eines Objekts mit erwarteten Feldern in diesem Fall nicht, da die Aufrufe von object.equals () enthält () und sie nicht gleich sind.

Ich habe mir so eine Lösung vorgenommen: Ich habe ein Interface HasId erstellt, es in all meine DTOs implementiert und ArrayList mit einer neuen Klasse geerbt, die die contains(Long id)-Methode hat.

public interface HasId {
    void setId(Long id);
    Long getId();
}

public class SearchableList<T extends HasId> extends ArrayList<T> {
    public boolean contains(Long id) {
        for (T o : this) {
            if (o.getId() == id)
                return true;
        }
        return false;
    }
}

Aber in diesem Fall kann ich List und ArrayList nicht in SearchableList konvertieren ....__ Damit würde ich leben, wollte aber sicherstellen, dass ich das Fahrrad nicht erfinde.

BEARBEITEN (16. Oktober):

Mit der Einführung von Lambdas in Java 8 ist dies natürlich unkompliziert:

list.stream().anyMatch(dto -> dto.getId() == id);
28
Sergey

Ich schlage vor, eine einfache statische Methode wie Sie geschrieben haben, ohne zusätzliche Schnittstellen:

public static boolean containsId(List<DTO> list, long id) {
    for (DTO object : list) {
        if (object.getId() == id) {
            return true;
        }
    }
    return false;
}
47

Ich schlage vor, Sie überschreiben einfach die equals in Ihrer SearchableDto es würde ungefähr so ​​aussehen:

public boolean equals(Object o){
    if (o instanceof SearchableDto){
        SearchableDto temp = (SearchableDto)o;
        if (this.id.equals(temp.getId()))
            return true;
    }
    return false;
}

In diesem Fall sollte contains wahrscheinlich funktionieren, wenn es dieselbe id hat.

8
medopal

Nun, ich denke, Ihr Ansatz ist das Problem ein wenig zu kompliziert. Sie sagten:

Ich habe eine Liste von DTOs, die von einer Datenbank erhalten wurden, und sie haben eine ID.

Dann sollten Sie wahrscheinlich eine DTO-Klasse verwenden, um diese Elemente aufzunehmen. Wenn ja, setzen Sie id getter und setter in diese Klasse:

public class DTO implements HasId{
    void setId(Long id);
    Long getId();
}

Das reicht aus, um durch und ArrayList zu iterieren und nach der gewünschten ID zu suchen. Die Erweiterung der ArrayList-Klasse nur für das Hinzufügen der "compare-id" -Funktion scheint mir zu kompliziert. @Nikita Beloglazov ist ein gutes Beispiel. Sie können es noch verallgemeinern:

public boolean containsId(List<HasId> list, long id) {
    for (HasId object : list) {
        if (object.getId() == id) {
            return true;
        }
    }
    return false;
}
2
Heisenbug

Ihre Anforderung ist mir nicht klar. Wenn Sie sagen, dass die Liste ein Objekt mit einer angegebenen ID enthält, möchten Sie Folgendes tun:

  1. ermitteln Sie, ob die ID vorhanden ist, und handeln Sie entsprechend
  2. beziehen Sie immer das DTO mit der erforderlichen ID in Ihre Ergebnisse ein

Bei den meisten Antworten wurde davon ausgegangen, dass Sie 1 bedeuten. Wenn Sie darüber nachdenken, können Sie jedoch auch 2 bedeuten, wenn Sie die Formulierung der Frage formulieren. Sie können das erforderliche Ergebnis einschließen, indem Sie Ihre Abfrage ändern:

SELECT * FROM employee WHERE firstname = 'John' OR id = 42;
0
Adriaan Koster

Das habe ich in meiner DFS-Funktion "GetUnvisitedNeighbour" verwendet.

    public static int GetUnvisitedNeighbour(int v)
{
    Vertex vertex = VertexList.stream().filter(c -> c.Data == v).findFirst().get();
    int position = VertexList.indexOf(vertex);
    ...
}

Ich habe in C # gearbeitet. Lambda-Ausdrücke in C # lassen sich viel einfacher bearbeiten als in Java.

Sie können die Funktion filter verwenden, um die Bedingung für die Eigenschaft des Elements hinzuzufügen.

Verwenden Sie dann findFirst().get() oder findAny.get() entsprechend Ihrer Logik.

0
Nikhil Redij
   public boolean containsId(List<HasId> list, long id) {
    boolean flag = false;
    for (HasId object : list) {
        if (object.getId() == id) {
           flag = true;
        }
    }
    return flag;
}
0
Sarvesh Yadav