使用非完全排序条件对java流进行排序



我正试图创建一个方法,通过制作来对列表进行排序

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

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

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

返回一个流,该流由该流的元素组成,并根据提供的Comparator进行排序。

不会收回、删除或复制任何元素。和进去的元素一样,只是重新排序。

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

通常情况下但不是严格要求(compare(x,y) ==0)==(x.equals(y))。一般来说,任何比较器违反这个条件应该清楚地表明这个事实。这个建议使用的语言是"注意:此比较器强制排序不一致。"

当在地图或集合中使用时,这可能会导致对equals的混淆:

使用能够强制使用与equals不一致的排序对排序集进行排序(或已排序的地图)。假设一个具有显式比较器c与从集合S中提取的元素(或键)一起使用。如果c对S的排序与equals不一致,排序集合(或已排序的映射)的行为会"奇怪"。特别是已排序的集合(或已排序的映射)将违反集合(或map),这是根据相等来定义的。

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

相关内容

  • 没有找到相关文章

最新更新