带字段的比较器 类

Comparator classes with fields

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

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

Collections.sort(someArrayList, new SortClass(argument1, argument2));

我的问题是:

  • 做这样的事情有多普遍?

  • 是否算是好的设计?

  • 假设我得到一个用户输入,它应该改变一些对象之间的比较逻辑,构建一个新的包装器class(使用给定的参数)会被认为是更好的解决方案?

根据要求,我的 SortClass 是(我在上一节中概括了它,但这是我真正的排序 class):

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" 比较,以防平局。

如果您将此逻辑移动到第二个比较器中,会更清楚,并在以后给您更多的灵活性: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?

我不知道你所说的 'wrapper class' 是什么意思,但是如果你要问的话,基于用户输入动态构建比较器就可以了。