0

我正在尝试创建一种通过以下方式对列表进行排序的方法:

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

但我在Comprator javadoc中读到,比较需要是一个总排序关系。也就是说,除非它们相等,否则没有两个比较器可以具有相同的优先级。情况可能并非如此。

我正在尝试这个简单的比较器:

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

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

当然,我可以使处理器具有可比性,但我想避免对所有处理器进行修改。有没有办法用流对它们进行排序?作为替代方案,我可以编写自己的方法或创建更复杂的比较器,但我对缺乏更优雅的解决方案感到惊讶。

4

1 回答 1

1

读取引用原始流的元素被保留:

返回由该流的元素组成的流,根据提供的比较器排序。

不会驱逐、删除或复制任何元素。相同的元素从排序中出来,只是重新排序。

编辑:文档还声明了Comparator.compare

通常是这样,但并不严格要求(compare(x, y)==0) == (x.equals(y))。一般来说,任何违反此条件的比较器都应清楚地表明这一事实。推荐的语言是“注意:这个比较器强加了与等于不一致的排序。”

equals这可能会在地图或集合中使用时引起混淆:

当使用能够施加与等于不一致的排序的比较器来对排序集(或排序映射)进行排序时,应谨慎行事。假设带有显式比较器 c 的有序集合(或有序映射)与从集合 S 中提取的元素(或键)一起使用。如果 c 对 S 施加的排序与等于不一致,则有序集合(或有序映射)将表现得“奇怪”。特别是有序集合(或有序映射)将违反集合(或映射)的一般合同,它是根据等式定义的。

如果您将其视为键值对的抽象,则混淆会被消除Comparator:如果它们的键相等,您不会期望两个对相等。这只是意味着这些值的某些属性(即它们的键)被认为是相似的。如果您希望对象以Comparableequals最佳方式一致的方式实现同​​名接口Comparable

于 2016-04-20T11:11:11.263 回答