gpt4 book ai didi

java - 带字段的比较器类

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:05:53 27 4
gpt4 key购买 nike

在一个使用实现 Comparator 的类的项目中接口(interface),为了比较一些可比较的对象,我注意到我可以设计实现 Comparator<> 的类界面带字段,然后是Override compare(...)函数并将类的字段用于比较函数逻辑。

所以我必须像这样调用排序函数:

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

最佳答案

How common doing something like this is?

参数化比较器?不是很常见。通常,事物是根据它们自己的属性进行排序的。

Is it considered a good design?

是的,如果您想按到引用位置的距离对位置进行排序,那么使用参数化比较器似乎是实现此目的的好方法。

但是,我可以看到一件事我不喜欢。您的 SortHotelsByProximity 实际上是在与 POI(兴趣点?)进行“ secret ”比较,以防平局。

如果您将此逻辑移动到第二个比较器中,它会更清楚,并且稍后会给您更多的灵 active :SortHotelsByPOI。您可以将 Comparators 组合在一起以使用方法 thenComparing 计算平局,看起来像这样:

hotels.sort(new SortHotelsByProximity().thenComparing(new SortHotelsByPOI()))

Assuming I get a user input which should change the logic of the comparison between some objects, building a new wrapper class (with the given parameters) would be considered as a better solution for that matter?

我不知道您所说的“包装器类”是什么意思,但是如果您要问的话,基于用户输入动态构建比较器就可以了。

关于java - 带字段的比较器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55743542/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com