Java实现Comparable接口时如何按字典序使用compareTo()方法
现有代码问题
你当前编写的compareTo方法存在无限递归问题:方法内部的this.compareTo(a)会反复调用方法自身,运行后会直接抛出栈溢出异常,完全无法实现比较逻辑。
Comparable 实现规则
重写compareTo方法时需要遵循以下返回值约定:
- 返回负整数:当前对象(
this)排序优先级低于传入的对比对象 - 返回0:两个对象在排序逻辑下相等
- 返回正整数:当前对象(
this)排序优先级高于传入的对比对象
具体实现方案
你可以根据业务需要自定义属性的比较优先级,常规的地点排序逻辑为优先按州名称排序→州相同按县名称排序→依次按纬度、经度、海拔排序,实现代码如下:
@Override public int compareTo(Location other) { // 1. 比较州名称 int stateCompare = this.state.compareTo(other.state); if (stateCompare != 0) { return stateCompare; } // 2. 州相同,比较县名称 int countyCompare = this.county.compareTo(other.county); if (countyCompare != 0) { return countyCompare; } // 3. 县相同,比较纬度(Double.compare避免浮点精度问题) int latCompare = Double.compare(this.latitude, other.latitude); if (latCompare != 0) { return latCompare; } // 4. 比较经度 int lngCompare = Double.compare(this.longitude, other.longitude); if (lngCompare != 0) { return lngCompare; } // 5. 最后比较海拔 return Integer.compare(this.elevation, other.elevation); }
注意:如果你的业务场景中
state、county等属性可能为null,需要在比较前增加空值判断逻辑,避免触发空指针异常。你也可以根据实际需求调整属性的比较顺序,比如需要优先按海拔排序时,把海拔的比较逻辑放到最前面即可。
内容的提问来源于stack exchange,提问作者novice_programmer
相关产品推荐
相关产品推荐

