web-dev-qa-db-ja.com

オブジェクトのリストに、指定されたフィールド値を持つ何かが含まれているかどうかを確認しますか?

DBから受け取ったDTOのリストがあり、IDがあります。リストに指定されたIDのオブジェクトが含まれていることを確認したい。 contains()がObject.equals()を呼び出し、それらが等しくないため、この場合、予想されるフィールドを使用してオブジェクトを作成することは役に立ちません。

私はそのような解決策を思いつきました:インターフェースHasIdを作成し、それをすべてのDTOに実装し、contains(Long id)メソッドを持つ新しいクラスでArrayListを継承しました。

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

しかし、この場合、ListとArrayListをSearchableListに型キャストすることはできません...私はそれと一緒に暮らしますが、自転車を発明していないことを確認したかったのです。

編集(16年10月):

もちろん、Java 8にラムダを導入すると、これを行う方法は簡単です。

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

あなたが書いたような単純な静的メソッドを、追加のインターフェースなしで作成することを提案します。

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

equalsSearchableDtoをオーバーライドすることをお勧めします。

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

この場合、containsが同じidを持っている場合、おそらく動作するはずです。

8
medopal

まあ、あなたのアプローチは問題を少し複雑にしていると思います。あなたが言った:

DBから受け取ったDTOのリストがあり、IDがあります。

次に、おそらくDTOクラスを使用してこれらのアイテムを保持する必要があります。その場合、そのクラス内にid getterおよびsetterを配置します。

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

ArrayListを繰り返し処理して目的のIDを検索するには、これで十分です。 「compare-id」機能を追加するためだけにArrayListクラスを拡張すると、複雑になりすぎます。 @Nikita Beloglazovが良い例です。さらに一般化できます:

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

これは、DFS GetUnvisitedNeighbour関数で使用したものです。

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

以前はC#で働いていました。 C#のラムダ式は、Javaの場合よりも操作がはるかに簡単です。

filter関数を使用して、要素のプロパティの条件を追加できます。

次に、ロジックに従ってfindFirst().get()またはfindAny.get()を使用します。

1
Nikhil Redij

あなたの要件は私には明らかではありません。 「指定したIDのオブジェクトがリストに含まれていることを確認する」と言うとき、次のことを行います。

  1. iDが存在するかどうかを検出し、それに応じて行動する
  2. 結果に必要なIDのDTOを常に含める

ほとんどの回答は、あなたが1を意味すると仮定していますが、それについて考えるとき、あなたは質問の文言を考えると2を意味することもできます。クエリを変更して、必要な結果を含めることができます。

SELECT * FROM employee WHERE firstname = 'John' OR id = 42;
0
Adriaan Koster
   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