問題タブ [comparator]

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.

0 投票する
16 に答える
616930 参照

java - JavaでComparatorを使用してソートする方法

コンパレータの使い方を学びましたが、コンパレータに問題があります。コードにエラーがあります:

これが私のコードです:

比較方法でのキャストと何か関係があると思いますが、私はそれをいじっていましたが、それでも解決策を見つけることができませんでした

0 投票する
2 に答える
8397 参照

java - Javaでコンパレータ構文ヘルプを渡す

私はこれをいくつかの方法で試しました。最初の方法は、次のコードの下部にコンパレータを実装するクラスがあります。sortListByLastNameで比較を渡そうとすると、コンストラクターが見つからないというエラーが発生し、理由がわかりません。

そして、匿名の内部クラスを作成してそれを実行しようとすると、コンストラクターTreeMapがシンボルエラーを見つけることができないこともわかります。何かご意見は?

内部クラスメソッド:

0 投票する
3 に答える
17536 参照

java - null に関する Comparable および Comparator 契約

Comparable契約は、e.compareTo(null)をスローする必要があることを指定しますNullPointerException

APIから:

nullはどのクラスのインスタンスでもないため、 を返してもe.compareTo(null)をスローする必要があることに注意してください。NullPointerExceptione.equals(null)false

一方、ComparatorAPIは、比較時に何が起こる必要があるかについては何も言及していませんnull。を受け取り、最小要素としてput をComparable返すジェネリック メソッドの次の試行を検討してください。Comparatornull

これにより、次のことが可能になります。

質問は次のとおりです。

  • これは の許容可能な使用法ですか、それとも の比較とスローComparatorに関する不文律に違反していますか?nullNullPointerException
  • List含まれている要素を並べ替える必要さえあるのは良い考えnullですか、それとも設計エラーの確かな兆候ですか?
0 投票する
3 に答える
8835 参照

java - Javaでは、Collections.sort()スレッドで使用されるコンパレータは安全ですか?

コンパレータの単一のインスタンスを作成する場合、そのインスタンスを複数のスレッドで使用して、Collections.sort()を使用してコレクションを並べ替えることはできますか?または、スレッドセーフを確保するために、Collections.sort()を呼び出すたびにComparatorの新しいインスタンスを作成する必要がありますか?

0 投票する
3 に答える
3908 参照

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つあります。

0 投票する
7 に答える
5231 参照

javascript - Javascript ||、複数の変数値を比較する方法は?

この構文を正しく修正する方法:

(最初の 3 つの変数のいずれかが null または未定義であるかどうかを確認するため)

0 投票する
4 に答える
916 参照

java - 箱から出してすぐに使えるJavaの直接コンパレータ

Comparatorそのパラメータの1つにを必要とするメソッドがあります。通常の比較を行うaと逆の比較を行うComparatorリバースコンパレータを渡したいと思います。

java.util.CollectionsこれはreverseOrder()逆比較に適していますが、通常は見つかりませんでしComparatorた。

私の頭に浮かんだ唯一の解決策はCollections.reverseOrder(Collections.reverseOrder())です。しかし、doubleメソッドが内部を呼び出すので、私はそれが好きではありません。

もちろん、私はNormalComparatorこのように書くことができます:

しかし、Javaがこれに対する解決策をすぐに利用できないことに本当に驚いています。

0 投票する
2 に答える
8180 参照

java - Javaでソートされたリンクリストに挿入する

Node クラスに含まれるいくつかのオブジェクトを、ソートされた状態で LinkedList クラスに挿入する必要があります。Node クラスは次のようになります。

card は Comparator インターフェースを実装します。LinkedList クラス (Java.util.LinkedList クラスではなく、私が書いているリンク リスト クラス) のカード値によって、これらのカードを並べ替えられた順序 (低から高) に挿入する関数を作成しようとしています。どうすればこれができるか知っている人はいますか?また、二重にリンクされたリストにすることはできません。

0 投票する
2 に答える
10316 参照

java - Java: カスタム コンパレータから正しくない順序を返す PriorityQueue?

ノード クラスを比較するカスタム コンパレータを作成しましたが、Java プライオリティ キューがアイテムを正しい順序で返しません。

ここに私のコンパレータがあります:

getF は double を返します。ただし、いくつかのノードを優先キューに挿入した後、次を使用してそれらを出力します。

結果は次のとおりです。

これがなぜそうなのか、何か考えはありますか?私のコンパレータは間違っていますか?ありがとう。

マイク

0 投票する
13 に答える
2171 参照

java - Java:Equatableインターフェースの欠如を回避する方法は?

私の知る限り、SortedMapまたはなどは、等式(、 )をチェックするために型に(ではなく)をSortedSet使用します。compareToequalsComparable<?>containscontainsKey

しかし、特定のタイプが概念的に同等であるが、比較できない場合はどうなるでしょうか。
(ハッシュコード、メモリアドレス、...)

を宣言し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 Peterswaxwing