`
lc87624
  • 浏览: 143870 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Java Collections sort方法遇到的一个小问题

    博客分类:
  • java
阅读更多
有一个需求是要对拼接出来的飞行线路列表进行排序,自然地用到Collections.sort方法,然后实现自己的Comparator。
排序需要考虑多种因素,包括拼接出的线路的段数、线路经过的国家数等,其中有一个排序条件是:当线路的飞行时长大于待比较线路飞行时长的1.5倍时,忽略该线路在段数和国家数上的优势。
代码实现如下:
Collections.sort(results, new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> o1, Map<String, Object> o2) {
        ...				

	//若线路的飞行时长大于待比较线路飞行时长的1.5倍,则不再比较其他排序因素
	if(consumeTime1 > 1.5 * consumeTime2){
		return 1;
	}
				
	//段数越少,排序越靠前
	if(sectionNum1 > sectionNum2) return 1;
	if(sectionNum1 < sectionNum2) return -1;
        ...
}


貌似看起来没有什么问题,但偶然发现,有些排序不符合预期,细想后发现,以上排序规则其实是违背对称性的。
if(consumeTime1 > 1.5 * consumeTime2)

这个条件在consumeTime1 > consumeTime2的情况下是符合预期的,但当把比较的两个对象掉转过来,排序规则却不是对称的,即可能出现o1 > o2,o2 !<(不小于) o1的情况。

修改代码如下:
Collections.sort(results, new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> o1, Map<String, Object> o2) {
        ...				
	//若线路的飞行时长小于待比较线路,并且乘以1.5倍后仍小于,则不再比较其他排序因素
	if(consumeTime1 < consumeTime2 && 1.5 * consumeTime1 < consumeTime2){
		return -1;
	}
	//若线路的飞行时长大于待比较线路,且超过其飞行时长的1.5倍,则不再比较其他排序因素
	if(consumeTime1 > consumeTime2 && consumeTime1 > 1.5 * consumeTime2){
		return 1;
	}
				
	//段数越少,排序越靠前
	if(sectionNum1 > sectionNum2) return 1;
	if(sectionNum1 < sectionNum2) return -1;
        ...
}

问题解决。
分享到:
评论

相关推荐

    java-collections-framework1016

    在使用Java Collections Framework时可能会遇到一些常见的问题: - **线程安全**:默认情况下,大多数集合类不是线程安全的。可以使用`Collections.synchronizedList()`方法创建线程安全的集合。 - **不可变集合**...

    java集合某个字段按照中文拼音排序.docx

    例如,我们可以创建一个Record类,实现Comparable接口,并重写compareTo方法。在compareTo方法中,我们可以使用String的compareTo方法来比较两个字符串的大小。 ```java public class Record implements Comparable...

    一个用java编写的通讯录

    本篇我们将深入探讨一个使用Java语言编写的通讯录系统,了解其核心功能与实现原理。 通讯录系统通常用于存储个人或组织的联系人信息,包括姓名、电话、邮箱等关键数据。这个Java编写的通讯录系统,不仅具备基本的...

    java程序各种常用方法集锦

    在Java编程语言中,开发者经常会遇到各种问题,如数据处理、排序、分页、调试、时间操作以及网络通信等。本资源"java程序各种常用方法集锦"正是为了解决这些问题而整理的一份综合性的代码库,包含了大量实用的代码...

    java处理日期合并

    本文详细介绍了如何使用Java处理日期合并的问题,通过对`TimeoffDateDTO`类的定义和日期合并算法的具体实现,提供了一种有效的方法来解决实际工作中经常遇到的时间段重叠问题。这种方法不仅适用于员工请假时间的管理...

    Java面试题以及答案整理.pdf

    可以使用Java内置的`Collections.sort()`方法对集合进行排序,实现序列化则需实现`Serializable`接口。 14. **在COLLECTION框架中,实现比较要实现的接口** 要实现`Comparable&lt;T&gt;`接口,以便在集合中进行自然排序...

    java 相关问题(二)

    在Java编程语言中,"相关问题(二)"可能指的是开发者在实际开发过程中遇到的一些常见挑战,这可能包括但不限于类的排序、数据结构的管理、异常处理、内存管理等。以下是一些关于Java中类排序及其相关的深入知识点:...

    javaGUI成绩录入和排序文件读取

    4. 成绩排序:Java的Collections框架提供了多种排序方法,如Collections.sort()可以对List进行排序。在这个应用中,可能需要自定义Comparator,根据学生的某一属性(如成绩)进行排序。排序可以是升序或降序,也可以...

    java实现成绩管理

    可以使用Java内置的`Collections.sort()`方法,配合自定义比较器对成绩进行升序或降序排列。 6. **统计分析**:分析成绩可能涉及到计算平均分、最高分、最低分、及格率等。这需要掌握基本的数学统计知识,并能用...

    Java 疑难杂症_笔记.pdf

    - Lambda表达式提供了一种简洁的方式来表示只有一个方法的接口的实例,增强了代码的可读性和可维护性。 #### Jdk8的方法引用 - 方法引用是Lambda表达式的一种特殊形式,用于引用已有类或实例的方法或构造器。 ###...

    实验报告六-使用java集合类(学号姓名) .doc

    5. **排序操作**:使用`Collections.sort()`方法对列表中的学生按成绩进行降序排序。需要自定义比较器(Comparator)来指定排序规则。 ```java Collections.sort(students, new Comparator() { @Override ...

    java贪吃蛇

    - **数据结构**:排行榜通常是一个有序的数据结构,如链表或数组,可以使用Collections.sort()进行排序。 - **用户交互**:展示排行榜,允许用户查看和比较分数,这需要界面设计和事件监听。 5. **调试与优化** ...

    java计算两个经纬度之间的距离

    在处理GPS数据时,通常会遇到精度问题,如使用GPS坐标时,会包含小数部分,这些小数表示微秒级别的时间,需要正确解析和处理。此外,有时还需要考虑到时区和夏令时的影响。 总的来说,Java计算两个经纬度之间的距离...

    CoreJava 新手必

    `NullPointerException`表示试图访问一个空对象的成员。package是组织和命名空间管理的机制,用于避免类名冲突。如果不声明package,类将默认位于默认包中,但不同包间的类需要显式导入才能使用。 将Java程序编译成...

    java词频统计

    遍历分词结果,每次遇到一个单词,如果在地图中已经存在,则增加计数;如果不存在,则添加新条目并初始化计数为1。 5. **结果输出**:遍历统计结果,按频率降序排列,并打印出来。可以使用`Collections.sort()`方法...

    Java集合排序及java集合类详解

    Java集合框架是Java编程语言中的一个核心特性,它为存储、管理和操作对象提供了一组统一的接口和类。本文将深入探讨Java集合排序以及各种集合类的详细使用。 首先,让我们了解一下Java集合框架的基本概念。Java集合...

    java电子考勤系统(读CSV文件)

    Java中的`TreeMap`类可以按照键的自然顺序对映射进行排序,或者我们可以使用`Collections.sort()`方法配合自定义比较器。这里我们假设员工ID是数字,可以按数值大小排序: ```java List, Integer&gt;&gt; sortedEntries =...

Global site tag (gtag.js) - Google Analytics