0

次のようにしてリストをソートするメソッドを作成しようとしています:

private List<Processor> getByPriority(){                        
    return processors.stream().sorted( new ProcessorComparator() ).collect( Collectors.toList() );
}

しかし、Comprator の javadocを読みましたが、これは完全な順序関係である必要があります。つまり、2 つのコンパレータが等しくない限り、同じ優先度を持つことはできません。そうではないかもしれません。

私はこの単純なコンパレータを試していました:

public class ProcessorComparator implements Comparator<TTYMessageProcessor<?>>{

    @Override
    public int compare( Processor processor1 , Processor processor2 ) {         
        return processor1.getPriority() - processor2.getPriority();
    }       
} 

もちろん、プロセッサを同等にすることもできますが、すべてのプロセッサへの変更は避けたいと考えています。ストリームで並べ替える方法はありませんか? 別の方法として、独自のメソッドを作成するか、より複雑なコンパレータを作成することもできますが、より洗練されたソリューションがないことに驚いています。

4

1 に答える 1

1

参照を読み取ると、元のストリームの要素が保持されます。

指定された Comparator に従ってソートされた、このストリームの要素で構成されるストリームを返します。

要素が排除、削除、または複製されることはありません。同じ要素が、並べ替えられただけで、並べ替えられて出てきます。

編集:ドキュメントにはComparator.compareも記載されています

一般的にはそうですが、厳密には (compare(x, y)==0) == (x.equals(y)) である必要はありません。一般に、この条件に違反するコンパレータは、この事実を明確に示す必要があります。推奨される言語は、「注: このコンパレーターは、equals と矛盾する順序付けを課す」です。

equalsこれにより、マップまたはセットで使用する場合に混乱が生じる可能性があります。

並べ替えられたセット (または並べ替えられたマップ) を並べ替えるために equals と矛盾する順序付けを課すことができる比較演算子を使用する場合は、注意が必要です。明示的なコンパレータ c を持つソート済みセット (またはソート済みマップ) が、セット S から引き出された要素 (またはキー) で使用されているとします。c によって S に課された順序付けが equals と矛盾する場合、ソート済みセット (またはソート済みマップ) は次のようになります。 「奇妙」に振る舞う。特に、ソートされたセット (またはソートされたマップ) は、セット (またはマップ) の一般的な契約に違反します。これは、等しいという観点から定義されています。

キーと値のペアの抽象化として考えると、混乱は解消されますComparator。キーが等しい場合、2 つのペアが等しいとは思わないでしょう。これは単に、これらの値の一部のプロパティ (つまり、キー) が類似していると見なされることを意味します。オブジェクトをComparable一貫性のある方法にしたい場合equalsは、同じ名前のインターフェイスComparableを最適に実装してください。

于 2016-04-20T11:11:11.263 に答える