java - 根据对象属性从列表中挑选对象的算法

标签 java arrays list sorting object

有一个对象 Cars,其定义为,

class Cars{
      String make;
      String model;
      String year;
....
}

对对象的一些限制:

  1. 品牌、型号和年份可以采用任何值。

  2. 不能有两个对象具有相同的属性集。例如,不能有 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/

相关文章:

java - 在 Java 中生成具有最大值、最小值和平均值(平均值)的随机数

java - JSR303 的原始和可迭代原始 validator

javascript - 如何从 Javascript 数组中取出一个字段并创建另一个数组

java - 使用另一个数组的大小初始化多维数组而不处理java中的元素

java - 我如何在 JAVA 中将一个 JSON 数组重构为其他格式?

java - setter 在 Spring Framework #2 中如何工作?

python - 如何将数据集拆分/分区为训练和测试数据集,例如交叉验证?

c++ - 使用 STL 排序功能对列表进行排序

html - 具有不同尺寸图像的响应图像列表

Python将列表作为参数传递