1

Customer というエンティティと、フォームから値を取得する CustomerMapper というヘルパー クラスがあるとします。次に、この CustomerMapper をサービス レイヤーに送信して、ゲッターから値を抽出し、新しい Customer をデータベースに追加します。

ただし、 a を反復処理してList<Customer>、 customerID が別の に含まれているかどうかを確認する必要がありArrayList<CustomerMapper>ます。.contains() メソッドが要素で .equals() を呼び出すことを読みました.. だから私は Customer に equals() を実装するのが正しいかどうか疑問に思っていました。 customer.getId() と customerMapper.customerId() を比較します。

答えが「いいえ」の場合は、その理由を詳しく説明してください。

編集:

これが私が思いついたものです。私は arralists と created の両方を反復しましMap<Long, Customer>Map<Long, CustomerMapper>。基本的に、ID が > に含まれていないすべての Customer を削除する必要がありMap<Long, CustomerMapperます。今、私は繰り返してMap<Long, Customer>呼び出しMap<Long, CustomerMapp>.contaisKey(currentElement).ます。これは良い解決策ですか?このように3つのforループがあるからです。

4

5 に答える 5

5

メソッドを実装してこれを行うのは意味がありませんequals()。単に 2 つのオブジェクトが等しくないからです。

を抽出して、同じものがidあるかどうかを確認するだけです。CustomerMapper

于 2012-09-30T10:57:50.667 に答える
2

いいえ、等しいオブジェクトequalsを返すためにのみ実装する必要があります。trueの Javadoc を調べてequalsください。特に、対称性、推移性、反射性など、Javadoc によって課される関係が持つ必要があるプロパティについて調べてください。あなたの意図した実装は、少なくとも最初の 2 つ、おそらく最後の 1 つでも失敗すると思います。基準についてすべてのメンバーをテストする明示的なループを作成するだけです。

現在のソリューションについて:

地図を使うのはやり過ぎではありませんか?ids からCustomerMappers を に単純に収集し、HashSetそのセットを s のフィルタリング ループで使用することを提案しCustomerます。ところで、使用するアイデアequals は時間の複雑さを軽減しません。ループはメソッド呼び出しの背後にのみ隠されるcontainsため、合計で O(n 2 ) の複雑さが生じます。Set/Map を使用したソリューションは、O(1) ハッシュ ルックアップにより、実際にはそれほど複雑ではありません。全体的な複雑さは O(n) のみです。

于 2012-09-30T10:57:49.573 に答える
1

私はこれをしません。コレクションの他の用途について考えてみましょうjava.util.Set。次のコードを実行できます。

Set<Object> customerLikeObjects = new HashSet<Object>();
customer.add(new CustomerMapper(13));

if (customer.contains(new Customer(13))) {
    // Run some code
}

この条件では、ID 13 の顧客が既にセットに含まれているかどうかを確認してから、何らかのコードを実行する必要があります。しかし実際には、セットには顧客は含まれていませんが、いくつかの「類似した」オブジェクトが含まれています。実際のところ、2 つのオブジェクト タイプを 1 つのセットに混在させることはおそらくないでしょう。

この「賢い」解決策は問題を解決するように見えますが、最終的には非常に混乱するでしょう. 実際、「賢い」が、どういうわけか正しくないと感じることは、常に非常に悪い考えです。

于 2012-09-30T10:58:58.560 に答える
1

public boolean equals(Object that)「equals」メソッドのシグネチャは、任意のタイプのオブジェクト間の比較を実装できるように見えます。おそらく、次のようなものを追加する必要があります

if (that instanceof CustomerMapper){
//do your comparison here
}

メソッドの実装で。

instanceofただし、かなり遅いです。

于 2012-09-30T10:59:31.237 に答える
1

そのように equals をオーバーライドすることが「間違っている」理由は、equals の一般的な契約を破り、奇妙で微妙な (または奇妙で明白な) バグにつながる可能性があるためです。

ArrayList contains()のソースを見ると、リストを反復処理する indexOf() が呼び出されます。したがって、比較メソッドを自分で作成するためにパフォーマンスが低下することはありません (そして、間違いなく読みやすくなります)。

Customer と CustomerMapper の両方にgetId()メソッドがあると仮定します

public Boolean containsCustomer(List<CustomerMapper> customerMappers, Customer customer) {
  if (customer == null  || customerMappers == null || customerMappers.size() == 0) {
    return false;
  } 
  for (int i = 0; i < customerMappers.size(); i++) {
    if (customer.getId().equals(customerMappers[i].getId())) {
     return true;
    }
  }
  return false;
}
于 2012-09-30T11:09:20.190 に答える