我正在研究搜索/组织算法。我使用多个enum定义要组织的每条数据。例如:

enum CarType implements SearchFactor {
    CAR, SUV, TRUCK, SEMI, LIMO;
    @Override public SearchFactor getSearchFactor() { return this; }
}




enum PaintColor implements SearchFactor {
    BLACK, WHITE, BLUE, GRAY, RED;
    @Override public SearchFactor getSearchFactor() { return this; }
}


其中SearchFactor是:

interface SearchFactor { }


样本数据类为:

class Vehicle {
    CarType type = CarType.CAR;
    PaintColor color = PaintColor.BLACK;
}


现在对于组织部分,我只是创建一个包含SearchFactor的数组,并添加我希望算法遵循的SearchFactor枚举。通过逐步遍历Vehicle的数组并将Vehicletypecolor与包含的SearchFactor的数组进行比较来完成此操作。例如:

Vehicle[] getVehicleFromSearchFactor(SearchFactor[] factors) {
    ArrayList<Vehicle> factoredVehicles = new ArrayList<Vehicle>();
    for (Vehicle v : getListOfVehicles()) {
        for (SearchFactor f : factors) {
            if (v.type == f || v.color == f) {
                factoredVehicles.add(v);
                break;
            }
        }
    }
    return factoredVehicles;
}


这是好习惯吗?这太抽象了吗?

最佳答案

仅实现为getSearchFactor()return this方法有什么意义?

您的getVehicleFromSearchFactor方法中甚至没有使用它。

除此之外,为什么不呢?只要确保==是比较搜索因子的正确方法即可。对于enum,这很好,但对于其他对象,.equals(...)可能更好……甚至.appliesTo(...)之类。

(当然,以这种方式进行的搜索几乎不允许索引,并且具有O(车辆数量×搜索因子数量)时间复杂度。)

10-05 22:21