問題タブ [equality]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - アイテムの順序に関係なく、2 つのコレクションが等しいかどうかを比較する
2 つのコレクションを (C# で) 比較したいのですが、これを効率的に実装する最善の方法がわかりません。
Enumerable.SequenceEqualに関する他のスレッドを読みましたが、それはまさに私が探しているものではありません。
私の場合、両方に同じアイテムが含まれている場合、2 つのコレクションは等しくなります (順序に関係なく)。
例:
私が通常行うことは、あるコレクションの各アイテムをループして、それが他のコレクションに存在するかどうかを確認し、次に他のコレクションの各アイテムをループして最初のコレクションに存在するかどうかを確認することです。(長さを比較することから始めます)。
ただし、これは完全に正しいわけではなく、おそらく 2 つのコレクションが等しいかどうかを比較する最も効率的な方法ではありません。
間違っていると私が考えることができる例は次のとおりです。
これは私の実装と同じです。各アイテムが見つかった回数をカウントし、両方のコレクションでカウントが等しいことを確認する必要がありますか?
例はある種の C# (疑似 C# と呼びましょう) で書かれていますが、どの言語で答えてもかまいません。
注:簡単にするために例では整数を使用しましたが、参照型オブジェクトも使用できるようにしたいと考えています (内容ではなくオブジェクトの参照のみが比較されるため、これらはキーとして正しく動作しません)。
c# - 参照型の 2 つのインスタンスを比較するための「ベスト プラクティス」とは何ですか?
最近これに遭遇しました。これまで、2 つの参照型に実際に同じデータが含まれているかどうか(つまり、同じように見える 2 つの異なるインスタンス)を確認するために、等価演算子 ( == ) および/またはEqualsメソッドを喜んでオーバーライドしてきました。
自動テスト (参照/期待データと返されたデータの比較) に慣れてきたので、これをさらに使用しています。
MSDN のコーディング標準ガイドラインのいくつかを調べているときに、それを勧める記事に出くわしました。これで、記事がこれを言っている理由を理解しました(それらは同じインスタンスではないため)が、質問には答えていません:
- 2 つの参照型を比較する最良の方法は何ですか?
- IComparableを実装する必要がありますか? (これは値型のみに予約する必要があるという言及も見ました)。
- 私が知らないインターフェースはありますか?
- 私たちは自分自身を転がすべきですか?
どうもありがとう^_^
アップデート
私はいくつかのドキュメントを読み間違えたようです (長い一日でした)。
参照型を実装している場合、型が Point、String、BigNumber などの基本型のように見える場合は、参照型で Equals メソッドをオーバーライドすることを検討する必要があります。ほとんどの参照型は、 Equals をオーバーライドする場合でも、等価演算子をオーバーロードしないでください。ただし、複素数型など、値のセマンティクスを持つことを目的とした参照型を実装している場合は、等値演算子をオーバーライドする必要があります。
python - 「==」と「is」に違いはありますか?
私のGoogle-fuは私に失敗しました。
Pythonでは、同等性に関する次の2つのテストは同等ですか?
これは、インスタンスを比較するオブジェクト(たとえば)にも当てはまりますlist
か?
さて、この種の答えは私の質問です:
では、テストは、それらが同じオブジェクトであるかどうかを確認するために==
どこでテストするかを評価しますか?is
c - Cで構造体の等価性をどのように比較しますか?
標準 C で構造体の 2 つのインスタンスが等しいかどうかを比較するにはどうすればよいですか?
objective-c - isEqual: および hash をオーバーライドするためのベスト プラクティス
isEqual:
Objective-C で適切にオーバーライドするにはどうすればよいですか? 「キャッチ」は、2 つのオブジェクトが (メソッドによって決定されるように) 等しい場合isEqual:
、それらは同じハッシュ値を持つ必要があるようです。
Cocoa Fundamentals GuideのIntrospectionセクションには、という名前のクラスについて、次のようにコピーされた をオーバーライドする方法の例があります。isEqual:
MyWidget
ポインターの等価性、次にクラスの等価性をチェックし、最後にとプロパティisEqualToWidget:
のみをチェックするを使用してオブジェクトを比較します。例が示していないのは、オーバーライドする方法です。name
data
hash
等式に影響しない他のプロパティがあると仮定しましょうage
。ハッシュのみに影響を与えるhash
ようにメソッドをオーバーライドするべきではありませんか? もしそうなら、どうやってそれをしますか?とのハッシュを追加するだけですか?例えば:name
data
name
data
それで十分ですか?より良いテクニックはありますか?のようなプリミティブがある場合はどうなりますint
か? それらを変換しNSNumber
てハッシュを取得しますか? またはのような構造体NSRect
?
( Brain fart : 元々は「bitwise OR」を と一緒に書きました|=
。加算を意味します。)
java - URL.equals が Java でインターネットにアクセスする必要があることを回避するにはどうすればよいですか?
Java クラス ライブラリの URL クラスのequals()
メソッドは、DNS 要求を作成してホスト名の IP を取得し、2 つの IP が等しいかどうかを確認します。これは、同じ から作成された URL でも発生しますString
。このインターネット アクセスを回避する方法はありますか?
c# - 2 つの ICollection があるかどうかを調べる最速の方法コレクションには同じオブジェクトが含まれています
ICollection<T>
2 つのコレクションにまったく同じエントリが含まれているかどうかを確認する最も速い方法は何ですか? 総当りは明らかですが、もっとエレガントな方法があるのではないかと考えていました。
C# 2.0 を使用しているため、可能であれば拡張メソッドは使用しないでください。
編集: 答えは、順序付けされたコレクションと順序付けられていないコレクションの両方にとって興味深いものであり、うまくいけばそれぞれで異なるでしょう。
javascript - JavaScript の比較では、どの等号演算子 (== と ===) を使用する必要がありますか?
私はJSLintを使用してJavaScriptを調べていますが、ステートメント内で比較するなどのことを行うときに、 ==
(2つの等号)を(3つの等号)に置き換えるための多くの提案を返しています。===
idSele_UNVEHtype.value.length == 0
if
に置き換える==
とパフォーマンス上の利点はあり===
ますか?
多くの比較演算子が存在するため、パフォーマンスの向上は歓迎されます。
型変換が行われない場合、パフォーマンスは向上し==
ますか?
language-agnostic - ポーリング:渡されたオブジェクトがLHSタイプと一致しない場合の等式の正しい動作?
findbugsについて関連する質問をしましたが、もっと一般的な質問をしましょう。
ポリモーフィズムが可能なオブジェクト指向言語で作業していると仮定します。
言語が静的型チェック(Java、C ++など)をサポートしているとします。
言語がパラメータの分散を許可しないと仮定します(たとえば、Java、再び...)
Objectをパラメーターとして受け取る等式操作をオーバーライドする場合、パラメーターが、呼び出されたLHSと同じタイプまたはサブタイプではない状況でどうすればよいですか?
オプション1-オブジェクトが明らかに等しくないため、falseを返します
オプション2-言語が実際に分散をサポートしている場合(これが望ましい)、コンパイル時にエラーとしてキャッチされるため、キャスト例外をスローします。したがって、別のタイプが送信される状況は違法であるはずなので、実行時にこのエラーを検出することは理にかなっています。
c# - System.Collections.Generic.Dictionary とは.Equals は実際に行うのですか?
今日、一般的な辞書の単体テストを行っているときに、これに遭遇しました。
場合を除いて失敗しますactual == expected
(オブジェクト参照は同じです)。明らかに、actual.Equals(expected)
false も返します。
結構ですが、 の実装System.Collections.Generic.Dictionary<int, string>.Equals
が参照の等価性のみを行う場合、 のポイントはIEquatable
何ですか? 言い換えれば、ジェネリック コレクションに対して値の等価性を実現する組み込みの方法がないのはなぜでしょうか?
編集これまでの回答に感謝します。明らかに私の例では値型を使用していますが、私の不満はすべてのオブジェクトに当てはまると思います。ジェネリック コレクションの等価性が、その型の等価性の和集合にならないのはなぜですか? 参照の等価性を見つけるための別の規定があるため、予期しない動作は実際には問題になりません。IEquatable
Konrad Rudolph が指摘しているように、これにより、 を実装するオブジェクトのみを保持するコレクションの制約が導入されると思います。ただし、Dictionary のようなオブジェクトでは、これはあまり問題にならないようです。