2016-04-20 7 views
0

は私が行うことで、リストをソートする方法作成しようとしています:Javaストリームを非トータルの発注基準でソートします。

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(); 
    }  
} 

私はプロセッサが同等作ることができますが、私はすべてのProccessorsへの変更を避けたい:

私はこの単純なコンパレータをしようとしていました。ストリームで並べ替える方法はありませんか?代替案として、私自身の方法を書いたり、より複雑なコンパレータを作成したりできましたが、より洗練されたソリューションがないことに驚いています。元のストリームのreferences要素を読み込み

+4

プロセッサの優先順位を気にしない場合は、完全に細かいコンパレータです。この場合の「同等」は、プロセッサの優先順位と同じであるため、プロセッサ自体ではありません。 – BeyelerStudios

+0

javadocに従ったequalsメソッドと一貫しています。しかし、私はその交際について本当にわからない。私は、ストリームがストリームを既に存在するとみなして削除しないことを確認したいだけです。一方、同じ順序を持つプロセッサがランダムにソートされても、私は気にしません。ある日Pc(p = 2)はPb(p = 2)の前に現れ、逆行する。あなたの言い回し "プロセスの優先度とオブジェクトの平等の平等が照らし出されていました" – borjab

+0

私はJava 8を使用していますが、これはもっと複雑です: 'Comparator.comparingInt(Processor :: getPriority)'を使用してください。 –

答えて

1

は保存されている:

が設けコンパレータに従ってソートされ、このストリームの要素からなるストリームを返します。

要素は削除、削除または複製されません。同じ要素が、並べ替えられたものから出てきます。ちょうど並べ替えられたものです。

編集:ドキュメントもComparator.compare

に対する状態これは、一般的にそうである厳密(x.equals(==((X、Y )== 0を比較する)ことを必要としませんy))。一般的に言って、 がこの条件に違反するコンパレータは、この事実を明確に示すはずです。 推奨される言語は「注:このコンパレータは がequalsと矛盾する順序を適用します。」マップまたはセットで使用する場合

これはequalsについての混乱を導入することができる:設定ソート (または注文するequalsと一貫性のない順序付けを課す できるコンパレータを使用した場合

注意が必要ですソートされた地図)。明示的な コンパレータcを持つソートされた集合(またはソートされたマップ)が、集合Sから引き出された要素(またはキー)で使用されているとします。 Sのcによって課せられた順序がequalsと矛盾する場合、ソートされた 集合マップ)は「不思議なことに」動作します。特にソートされた セット(またはソートされたマップ)は、set(または マップ)の一般契約に違反します。これは、equalsで定義されています。

あなたはおよそComparatorキーと値のペアの抽象化などを考える場合、混乱が解除されます。そのキーが等しかった場合には次の2つのペアが等しくなるように期待していません。それは、それらの値(すなわちそれらのキー)のいくつかの特性が同様に考慮されることを意味するだけである。オブジェクトがComparableであることを、equalsと一貫して同じ方法で実装したい場合は、同等の名前のインターフェイスComparableを実装することをお勧めします。

+0

@borjabあなたが追加したものは、リストのソートにはまったく適用されません。セットとマップでは、このように見えます。コンパレータは、キーのペアをソートするキーと値のペアを持つという概念を抽象化しますが、キーが等価を比較する場合、ペアが別のものになるという仮定はありません。実際、この意味では、私は実際の文書化の選択肢に強く反対しています*一般的にはそうです... *、それは一般的に**そうではありません。そうでなければ 'Comparable.compareTo'を外部' Comparator '... – BeyelerStudios

関連する問題