在一个使用实现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;
}
}
答案 0 :(得分:2)
做这样的事情有多普遍?
参数化比较器?不是很常见。通常,事物根据其自身的属性进行排序。
这是一个好的设计吗?
是的,如果要按与参考位置的距离对位置进行排序,那么使用参数化的比较器似乎是实现此目的的一种好方法。
但是,我可以看到我不喜欢的一件事。您的SortHotelsByProximity
实际上正在和POI(兴趣点?)进行“秘密”比较。
如果要将此逻辑移至第二个比较器:SortHotelsByPOI
,它将更加清楚,并在以后为您提供更大的灵活性。您可以使用方法onCreatePage
将比较器组合在一起以考虑平局,如下所示:
hotels.sort(new SortHotelsByProximity().thenComparing(new SortHotelsByPOI()))
假设我收到了一个用户输入,该输入应更改 比较一些对象,建立一个新的包装类(带有 给定的参数)将被视为更好的解决方案 那件事吗?
我不知道您所说的“包装器类”是什么意思,但是如果您要的是基于用户输入的动态构建比较器就可以了。