有一个对象 Cars,其定义为,
class Cars{
String make;
String model;
String year;
....
}
对对象的一些限制:
品牌、型号和年份可以采用任何值。
不能有两个对象具有相同的属性集。例如,不能有
car1 = { make : "Audi", model : "A6", Year : "2008"}
和car2 = { make : "Audi",型号:“A6”,年份:“2008”}
假设我与一项服务交谈,该服务为我提供了所有汽车对象的列表。我有一个输入(品牌、型号、年份)。我的工作是从列表中选择汽车对象(由服务返回)。我应该这样做,以便选择与尽可能多的属性匹配的对象。
让我举个例子。假设我从服务中获取了 5 辆车的列表,
car1 = { make : "", model : "A6", year : "2008" }
car2 = { make : "Audi", model : "", year : "2008" }
car3 = { make : "Audi", model : "A6", year : "" }
car4 = { make : "", model : "", year : "" }
car5 = { make : "BMW", model : "M3", year : "2009" }
如果我的输入是
{make : "Audi", model : "A6", year : "2008"}
我应该只能从列表中选择一辆车。如果相同数量的参数匹配,我应该按照制造商>型号>年份的顺序给予优先选择。在上述情况下,我应该选择 car3。
如果我的输入是
{ make : "Mercedes", model : "C300", year : "2008" }
我应该选择 car4 = { make : "", model : "",year : ""}
(通用的)
关于解决此问题和/或伪代码有什么建议吗?
最佳答案
请注意,我们不需要在这里进行任何排序,只需找到最大分数即可。排序使您的解决方案成为 O(NlogN)
,而查找最大值则为 O(N)
。
public Car getBestSelection(List<Car> cars, String make, String model, String year){
Map<Car, Integer> scoreMap = new HashMap<>(cars.size());
// Find scores for all valid cars
for(Car car : cars)
if(isValidCar(car, make, model, year))
scoreMap.push(car, calcScore(car, make, model, year));
// find max score
Car maxCar;
int maxScore;
for(Map.Entry<Car, Integer> e : scoreMap.entrySet()){
if(e.getValue() > maxScore){
maxScore = e.getValue();
maxCar = e.getKey();
}
}
return maxCar;
}
public int calcScore(Car car, String make, String model, String year){
int makeScore = car.make.equals(make) ? Math.pow(2,2) : 0;
int modelScore = car.model.equals(model) ? Math.pow(2,1) : 0;
int yearScore = car.year.equals(year) ? Math.pow(2,0) : 0;
return makeScore + modelScore + yearScore;
}
public boolean isValidCar(Car car, String make, String model, String year){
return (car.make.equals("") && car.model.equals("") && car.year.equals("")) ||
(car.make.equals(make) || car.model.equals(model) || car.year.equals(year));
}
关于java - 根据对象属性从列表中挑选对象的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31660799/