2011-09-20 4 views
25

私はDBから受信したDTOのリストを持っており、IDを持っています。リストに指定されたIDのオブジェクトが含まれていることを確認します。この場合、期待されるフィールドを持つオブジェクトを作成すると、Object.equals()のcontains()呼び出しが同じではないため、おそらく役に立ちません。オブジェクトのリストに指定されたフィールド値を持つものが含まれているかどうかを確認しますか?

インタフェース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; 
    } 
} 

が、この場合には、私はSearchableListに型キャスト一覧とArrayListのことができない...私はそれと一緒に暮らすだろう が、私は自転車を発明ないよことを確認したかったのです。

EDIT(10月'16):

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

list.stream().anyMatch(dto -> dto.getId() == id); 
+9

「ホイールを発明する」ことを意味すると確信しています。 – Nishan

+0

なぜリストを検索しないのですか? –

+0

Nishan、これはまさに私が意味していた、それは翻訳の問題でした:D Ray Tayek、うわー、そのようなシンプルでエレガントなアイデアは私の心を越えていませんでした。ありがとうございます – Sergey

答えて

44

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

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

コードの読みやすさを向上させるために、forとifから大括弧を削除します。私の意見では良い練習です。とにかくこのメソッドのおかげで! – wzieba

+0

うん、パフォーマンスの面で最良の選択肢ではない、私は@ medopalの解決策が良いと思う。 – Choletski

+1

@Choletskiここでパフォーマンスに何が問題なの?並列計算を使用しないと仮定すると、O(N)よりもうまくいくわけではありません。 –

2

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

私は、DBから受け取ったDTOのリストを持っていて、IDを持っています。

これらのアイテムを保持するには、おそらくDTOクラスを使用する必要があります。その場合、そのクラスにidter getterとsetterを入れてください:

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

これは、iterate throughとArrayListを実行し、目的のIDを検索するのに十分です。 "compare-id"要素を追加するためだけにArrayListクラスを拡張することは、私にとっては複雑すぎるようです。 @ニキータBeloglazovは良い例を作る。あなたも、より多くのそれを一般化することができます

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

を私はあなたがちょうどあなたのSearchableDtoそれはようなものになるだろうでequals上書き勧め:それは同じidを持っている場合containsは、おそらく動作するはずです。この場合、

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

を;

0

あなたは要件がわかりません。あなたがしたくない「私のリストは、指定されたIDを持つオブジェクトが含まれていることを確認してください」と言うとき:IDが存在し、それに応じ

  • は、常にあなたの結果に必要なIDとDTOを含ん行動する場合

    1. を検出します

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

    SELECT * FROM employee WHERE firstname = 'John' OR id = 42; 
    
  • +0

    テストステートメントで、私のHibernateコードがマッピングを正しく行い、データベースから適切な値を抽出していることを確認したかったのです。 – Sergey

    +0

    これが特定のテストケースである場合は、検索したオブジェクトをループして、目的のIDが見つからない場合はテストに失敗しないのはなぜですか?なぜあなたはあなたのDTOがHasIdインターフェイスを実装するだけですか? –

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

    'for each'ループを壊す方が良いでしょう。フラグ値は、最後までループする代わりに真です。 –

    0

    これは私が私の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()を使用してください。

    関連する問題