Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现可配置的排序标准_Java_Oop_Design Patterns - Fatal编程技术网

Java 实现可配置的排序标准

Java 实现可配置的排序标准,java,oop,design-patterns,Java,Oop,Design Patterns,我需要能够根据多个条件对对象进行排序,并且这些排序需要可以从application.properties文件进行配置(因为应该可以在文件中指定要应用的排序和顺序) 因此,在我的设计中,我为每种类型创建了一个比较器,然后与供应商创建了一个枚举,例如: public enum CarSort { ENGINE(CarEngineComparator::new), BRAND(CarBrandComparator::new); private final Supplier<Co

我需要能够根据多个条件对对象进行排序,并且这些排序需要可以从application.properties文件进行配置(因为应该可以在文件中指定要应用的排序和顺序)

因此,在我的设计中,我为每种类型创建了一个比较器,然后与供应商创建了一个枚举,例如:

public enum CarSort {
    ENGINE(CarEngineComparator::new), BRAND(CarBrandComparator::new);

    private final Supplier<Comparator<Car>> constructor;

    CarSort(Supplier<Comparator<Car>> constructor){
        this.constructor = constructor;
    }

    Comparator<Car> newComparator() {
        return constructor.get();
    }
}
并用以下内容链接分类:

    Stream<Comparator<Car>> comparators = sorts.stream().map(CarSort::newComparator);
    return comparators
            .reduce(Comparator::thenComparing)
            .map(comparator -> filteredCars.sorted((comparator.reversed())))
            .orElse(filteredCars)
            .collect(Collectors.toList());
streamcomparators=sorts.Stream().map(CarSort::newComparator);
返回比较器
.reduce(比较器::然后比较)
.map(comparator->filteredCars.sorted((comparator.reversed()))
.orElse(过滤卡)
.collect(Collectors.toList());
我现在的问题是,其中一个比较器需要两个参数,所以我认为这个解决方案不再适用,但我现在想不出任何干净的替代方案

您是否知道是否有可能调整我当前的设计以满足此要求,或者是否有其他可行的解决方案

我将添加更多细节。比如说,我需要添加一个特定的比较器来对汽车进行分类,例如根据汽车与客户的距离。所以它可能是这样的(细节其实并不重要,只是它需要一个额外的参数):

公共类CardStanceComparator实现Comparator{
私人位置来源;
心脏比较器(位置原点){
this.origin=origin;
}
@凌驾
公共整数比较(o1车、o2车){
double distanceToFirstCar=DistanceService.CalculatedInstance(origin,o1.getLocation());
double distanceToSecondCar=DistanceService.calculateDistance(origin,o2.getLocation());
返回Double.compare(distanceToFirstCar,distanceToSecondCar);
}
}

因此,我希望能够为多个客户按品牌、引擎、距离(在配置文件中指定)进行排序。这意味着每次我都需要将不同的参数传递给DistanceComparator。

是否使用方法引用是这里的问题?(如
CarEngineComparator::new
)?嗯,我不确定,可能是,但我没有看到它,如果没有方法引用,它会是什么样子?我的意思是,我在哪里或如何将参数传递给CarBrandComparator,例如?
引擎(()->new CarEngineComparator(..)
Hmm,但我认为这不起作用,因为这些参数不是静态的,它们根据我检索比较器的时间/地点而不同。请编辑您的问题,添加更多详细信息。如果不了解这些,我们就无法提供有效的答案
    Stream<Comparator<Car>> comparators = sorts.stream().map(CarSort::newComparator);
    return comparators
            .reduce(Comparator::thenComparing)
            .map(comparator -> filteredCars.sorted((comparator.reversed())))
            .orElse(filteredCars)
            .collect(Collectors.toList());
public class CarDistanceComparator implements Comparator<Car> {

    private Location origin;

    CarDistanceComparator(Location origin) {
        this.origin = origin;
    }

    @Override
    public int compare(Car o1, Car o2) {
        double distanceToFirstCar = DistanceService.calculateDistance(origin, o1.getLocation());
        double distanceToSecondCar = DistanceService.calculateDistance(origin, o2.getLocation());
        return Double.compare(distanceToFirstCar, distanceToSecondCar);
    }
}