2

全準順序 (全前順序とも呼ばれます) は、2 つの異なる要素が「同じサイズ」であると見なされることが許される、一種の弱い順序関係です。たとえば、2 つの異なる文字列が同じ長さを持つ可能性があるため、すべての文字列のセットは長さによって準順序付けされます。

ここで、文字列のリストがあり、それを長さで並べ替えたいとします (短い順)。2 つの文字列が同じ長さの場合、どちらが先かは気にしません。一見すると、書くのは理にかなっているように見えます

Collections.sort(list, (s, t) -> s.length() - t.length());

残念ながら、これは違法です。Comparator インターフェースの Javadoc では、比較が完全な順序付けを実装する必要があることを明確に要求しています。"a".length() - "b".length() は 0 に等しいが、"a".equals("b") は false であるため、これに違反しています。

では、これをきれいにするにはどうすればよいでしょうか。きれいにとは、たとえばハッシュコードや自然な順序付けによる偽の比較を導入しないことを意味します。

4

2 に答える 2