在一个使用实现Comparator
接口的类的项目中,为了比较一些可比较的对象,我注意到我可以设计用字段实现Comparator<>
接口的类,然后Override
用compare(...)
函数并使用类的比较函数逻辑的字段。
所以我必须调用这样的sort函数:
Collections.sort(someArrayList, new SortClass(argument1, argument2));
我的问题是:
根据我的要求,我的SortClass是(我在上面的部分中概括了它,但这里是我真正的排序类):
public class SortHouses implements Comparator<Hotel> {
/** if house1 should be before house2 */
private static final int GT = -1;
/** if house1 should be after house2 */
private static final int LT = 1;
private double latitude;
private double longitude;
public SortHouses(double latitude, double longitude){
this.latitude = latitude;
this.longitude = longitude;
}
@Override
public int compare(House house1, House house2) {
double distHouse1 = Math.sqrt((Math.pow((house1.getLatitude() - latitude), 2) +
Math.pow((house1.getLongitude() - longitude), 2)));
double distHouse2 = Math.sqrt((Math.pow((house2.getLatitude() - latitude), 2) +
Math.pow((house2.getLongitude() - longitude), 2)));
if (distHouse1 < distHouse2){
return GT;
}
if (distHose1 > distHouse2) {
return LT;
}
if (house1.getNum() > house2.getNum()){
return GT;
}
return LT;
}
}
做这样的事情有多常见?
参数化的比较器?不太常见。通常情况会根据自己的属性进行排序。
它被认为是一个好的设计?
是的,如果您想按距离对参考位置进行排序,那么使用参数化比较器似乎是一种很好的方法。
但是,我可以看到一件我不喜欢的事情。你的SortHotelsByProximity
实际上是在与抽签的情况下与POI(兴趣点?)进行“秘密”比较。
如果你将这个逻辑转移到第二个比较器:SortHotelsByPOI
,它会更清晰,并在以后给你更大的灵活性。您可以将比较器组合在一起以使用thenComparing
方法进行绘制,这看起来像这样:
hotels.sort(new SortHotelsByProximity().thenComparing(new SortHotelsByPOI()))
假设我得到的用户输入应该改变某些对象之间的比较逻辑,那么构建一个新的包装类(使用给定的参数)会被认为是更好的解决方案吗?
我不知道'包装类'是什么意思,但是根据用户输入动态构建比较器很好,如果这就是你所要求的。