带有字段的比较器类

问题描述 投票:3回答:1

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

所以我必须调用这样的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;
    }
}
java comparator comparable
1个回答
2
投票

做这样的事情有多常见?

参数化的比较器?不太常见。通常情况会根据自己的属性进行排序。

它被认为是一个好的设计?

是的,如果您想按距离对参考位置进行排序,那么使用参数化比较器似乎是一种很好的方法。

但是,我可以看到一件我不喜欢的事情。你的SortHotelsByProximity实际上是在与抽签的情况下与POI(兴趣点?)进行“秘密”比较。

如果你将这个逻辑转移到第二个比较器:SortHotelsByPOI,它会更清晰,并在以后给你更大的灵活性。您可以将比较器组合在一起以使用thenComparing方法进行绘制,这看起来像这样:

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

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

我不知道'包装类'是什么意思,但是根据用户输入动态构建比较器很好,如果这就是你所要求的。

© www.soinside.com 2019 - 2024. All rights reserved.