問題タブ [comparable]
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.
java - Comparable を複数回実装するにはどうすればよいですか?
一部のコードを Java 5 にアップグレードしていますが、明らかに Generics について理解していません。Comparable を一度実装する他のクラスがあり、実装できました。しかし、今では、継承のために、2 つの型に対して Comparable を実装しようとするクラスを取得しました。これが私の状況です:
私は次のクラス/インターフェースを持っています:
これにより、「interface Comparable を異なる引数で複数回実装することはできません...」というエラーが表示されます。
FooBar に compareTo(Foo foo) を実装し、BarDescription にも compareTo(Bar) を実装できないのはなぜですか? これは単にメソッドのオーバーロードではありませんか?
編集: BarDescription を拡張する多くのクラスがあります。BarDescription を拡張するすべてのクラスをソートするときに、Comparable on Bar の型パラメーターを削除して raw 状態のままにすると、コンパイラーの警告が大量に表示されます。これは、以下のワイルドカードの回答で解決されますか? その答えは非常に複雑で、メンテナンスのために理解するのが難しいようです。
java - Equals() の結果には一貫性がありますが、TreeMap.containsKey() の結果には一貫性がありません
私は次のオブジェクトを持っていますNode
:
そして、私はそれを次のように使用しますTreeMap
:
現在、ツリー マップは、Graph
現在グラフ内にあるノードとそのエッジのセットを ( クラス からEdge
) 格納するために呼び出されるクラスで使用されます。私の問題は、実行しようとするときです:
私は時々次のようになります:
HASHCODE: true EQUALS: true CONTAINS: false N: foo X: foo COMPARES: 0
誰が私が間違っているのかについて考えを持っていますか? 私はまだこれらすべてに慣れてhashCode()
いないので、簡単なことを見落としている場合は事前にお詫びします ( TreeMap
.
edit1:compareTo()
メソッド情報を追加しました。
c# - C#.NET:SortedDictionaryの降順比較?
IDictionary<float, foo>
最初にキーの大きい値を返すaが必要です。
ただし、これは小さいものから順に値を返します。私はここで愚かな間違いを犯しているような気がします。
何が起こるかを確認するために-
、コンパレータから符号を削除しました。
しかし、私は同じ結果を得ました。これは、私が愚かな誤りを犯しているという私の直感を補強します。
辞書にアクセスするコードは次のとおりです。
更新:これは機能しますが、このメソッドを呼び出す必要があるほど頻繁に呼び出すには遅すぎます:
更新:辞書にkvペアを追加したり削除したりするときに、ヒットしないブレークポイントをコンパレータに配置しました。これはどういう意味ですか?
java - なぜJavaはジェネリックで私のLinkedListを受け入れないが、それ自身を受け入れるのですか?
クラスの割り当てでは、どの言語のbultinタイプも使用できないため、自分のリストに固執しています。とにかく、これが状況です:
でも:
動作します。MyTreeはComparableインターフェースを実装しますが、MyLinkedListは実装しません。ただし、これによると、JavaのLinkedListもそれを実装していません。では、何が問題で、どうすれば修正できますか?
MyLinkedList:
MyTree:
java - null に関する Comparable および Comparator 契約
Comparable
契約は、e.compareTo(null)
をスローする必要があることを指定しますNullPointerException
。
APIから:
null
はどのクラスのインスタンスでもないため、 を返してもe.compareTo(null)
をスローする必要があることに注意してください。NullPointerException
e.equals(null)
false
一方、Comparator
APIは、比較時に何が起こる必要があるかについては何も言及していませんnull
。を受け取り、最小要素としてput をComparable
返すジェネリック メソッドの次の試行を検討してください。Comparator
null
これにより、次のことが可能になります。
質問は次のとおりです。
- これは の許容可能な使用法ですか、それとも の比較とスロー
Comparator
に関する不文律に違反していますか?null
NullPointerException
List
含まれている要素を並べ替える必要さえあるのは良い考えnull
ですか、それとも設計エラーの確かな兆候ですか?
java - Javaコレクションフレームワークが2つの異なるソート方法を提供するのはなぜですか?
ソートしたい要素のリストがある場合、Javaはこれを行うための2つの方法を提供します。
たとえば、Movieオブジェクトのリストがあり、それらをタイトルで並べ替えたいとします。
これを行う1つの方法は、ムービーリストを単一の引数として静的java.util.Collections.sort()メソッドの1つの引数バージョンを呼び出すことです。したがって、Collections.sort(myMovieList)を呼び出します。これを機能させるには、java.lang.Comparableインターフェイスを実装するようにMovieクラスを宣言する必要があり、必要なメソッドcompareTo()をこのクラス内に実装する必要があります。
ソートする別の方法は、静的java.util.Collections.sort()メソッドの2つの引数バージョンを、ムービーリストとjava.util.Comparatorオブジェクトを引数として呼び出すことです。私はCollections.sort(myMovieList、titleComparator)を呼び出します。この場合、MovieクラスはComparableインターフェイスを実装しません。代わりに、ムービーリスト自体を構築および維持するメインクラス内に、java.util.Comparatorインターフェイスを実装する内部クラスを作成し、必要な1つのメソッドcompare()を実装します。次に、このクラスのインスタンスを作成し、2引数バージョンのsort()を呼び出します。この2番目のメソッドの利点は、これらの内部クラスのコンパレータを無制限に作成できるため、オブジェクトのリストをさまざまな方法で並べ替えることができることです。上記の例では、
私の質問は、2引数バージョンのCollections.sort()が最初の1引数バージョンが行うすべてのことを実行するのに、なぜJavaで両方のソート方法を学ぶ必要があるのかということですが、リストの要素をソートできるという追加の利点がありますいくつかの異なる基準に基づいていますか?コーディング中に覚えておかなければならないことが1つ少なくなります。知っておくべきJavaでリストをソートする基本的なメカニズムが1つあります。
java - 箱から出してすぐに使えるJavaの直接コンパレータ
Comparator
そのパラメータの1つにを必要とするメソッドがあります。通常の比較を行うaと逆の比較を行うComparator
リバースコンパレータを渡したいと思います。
java.util.Collections
これはreverseOrder()
逆比較に適していますが、通常は見つかりませんでしComparator
た。
私の頭に浮かんだ唯一の解決策はCollections.reverseOrder(Collections.reverseOrder())
です。しかし、doubleメソッドが内部を呼び出すので、私はそれが好きではありません。
もちろん、私はNormalComparator
このように書くことができます:
しかし、Javaがこれに対する解決策をすぐに利用できないことに本当に驚いています。
java - Java HashSet は複製を許可しています。比較の問題?
Comparable compareTo メソッドを実装するクラス「Accumulator」があり、これらのオブジェクトを HashSet に入れようとしています。
HashSet に add() すると、ブレークポイントを設定した場所に関係なく、デバッガーの compareTo メソッドにアクティビティが表示されません。さらに、add() の処理が完了すると、Set 内にいくつかの重複が表示されます。
ここで私は何を台無しにしていますか。なぜそれは比較していないので、重複を許可するのですか?
ありがとう、
IVRアベンジャー
java - Java-オブジェクトコレクションを使いやすくする
オブジェクトが一意の主キーを保持している場合、特に効率的にソート可能、ハッシュ可能などの点でコレクションに適したものにするために、どのインターフェイスを実装する必要がありますか?
主キーが文字列の場合、これらのインターフェイスはどのように最適に実装されますか?
ありがとう!
java - Java:Equatableインターフェースの欠如を回避する方法は?
私の知る限り、SortedMap
またはなどは、等式(、 )をチェックするために型に(ではなく)をSortedSet
使用します。compareTo
equals
Comparable<?>
contains
containsKey
しかし、特定のタイプが概念的に同等であるが、比較できない場合はどうなるでしょうか。
(ハッシュコード、メモリアドレス、...)
を宣言しComparator<?>
、メソッドをオーバーライドする必要がありますint compareTo(T o1, To2)
。OK、等しいと見なされるインスタンスに対して0を返すことができます。しかし、不規則な場合、注文が明確でない場合は何を返しますか?
SortedMapまたはSortedSetを同等に使用するアプローチは、(概念的には)同等のタイプではありませんか?
ありがとうございました!
編集:
並べ替えて保存したくないのですが、「通常の」マップとセットを使用すると、平等の動作を「オーバーライド」できませんでした。
編集2:
なぜ私は単にオーバーライドできないのですかequals(...)
:
私は外国のクラスの平等の振る舞いを変更する必要があります。編集できません。
編集3:
.NETについて考えてみてください:それらは、同等の動作に触れることなく、同等の動作を変更するIEquatableインターフェイスを備えています。
編集4:等しい場合は0を返し、等しくない場合は1を返す
ことはできませんか?compareTo
大きな問題は何ですか?いくつかのテストをドーム型にしましたが、SortedMap/SortedSetがインスタンスのペアでcompareToを一度呼び出したようです。はい、順序は意味がありませんが、なぜそれが私の問題になるのですか?注文は必要ありません。*私は平等行動を変える必要があります。悲しいことに、ほとんどの人はこれを理解できません。
注:等しくないインスタンスに対して1を返すという概念は、間違っていることが証明されました。
編集5:
平等を変える-外国のクラスの振る舞いは悪い概念ですか?もちろん?私はそうは思いません:なぜ私は外国のクラスの比較行動を使用して変更することを許可されているのComparator
ですか?
編集6:カスタムクラスでキータイプをラップするというアイデアに感謝
します。このようにして、equalsとhashCodeをオーバーライドして、equality-behaviorを変更できます。Mark Peters
waxwing