我需要能够按多种条件对对象进行排序,并且这些排序需要可以从application.properties文件进行配置(因为应该可以在文件中指定要应用的排序和顺序)。
因此,在我的设计中,我为每种类型的比较器创建了一个比较器,然后创建了一个带有供应商的枚举,例如:
<html>
<head>
<title>Printer Install</title>
<HTA:APPLICATION
APPLICATIONNAME = "Printer Install"
SCROLL = "Yes"
MAXIMIZEBUTTON = "no"
SINGLEINSTANCE = "yes"
INNERBORDER = "yes"
BORDER = "dialog"
NAVIGABLE = "no"
CONTEXTMENU = "no"
ICON = ""
</head>
<SCRIPT Language="VBScript">
Sub Window_Onload
Self.ResizeTo 450, 400
Self.MoveTo 420, 190
End Sub
Set Objnetwork = CreateObject("wscript.network")
Sub Install
printserver = document.getElementById("server").value
strPrinterName = document.getElementById("name").value
strprinterpath = "\\" & printserver & "\" & strPrinterName
objNetwork.AddWindowsPrinterConnection strprinterpath
MsgBox "Successfully mapped" & "\\" & printserver & "\" & strPrinterName
End Sub
</SCRIPT>
<body>
Printer Server: <input type="text" id="server"></input><p>
Printer Name: <input type="text" id="name"></input><p>
<input type="button" onclick="Install" value="Install"></input><p>
</body>
</html>
通过这种设计,我将能够从属性文件中加载排序:
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();
}
}
并用类似的方式链接排序:
myapp.cars.sorts=BRAND,ENGINE
我目前遇到的问题是比较器之一需要两个参数,因此我认为该解决方案不再适用,但是目前我无法想到任何干净的选择。
您知道是否有可能使我当前的设计适应这一要求,或者有其他可行的解决方案?
我将添加更多详细信息。假设我需要添加特定的比较器,例如根据它们离客户端的距离来进行排序。因此可能是这样的(细节实际上并不重要,只是需要一个附加参数这一事实):
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());
因此,我希望能够按品牌,发动机,距离(在配置文件中指定)对多个客户进行排序。这意味着我每次都需要将一个不同的参数传递给DistanceComparator。