2011-08-16 1 views
0

Я работаю над поисковым/организационным алгоритмом. Я использую несколько 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; 
} 

Теперь для организации части, Я просто создаю массив inc inc luded SearchFactor и добавьте перечисление того, что SearchFactor Я хотел бы алгоритм следовать. Это делается путем постепенной ходьбы по массиву от Vehicle и сравнивая Vehicle s type и color с массивом включенных SearchFactor s. Например:

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; 
} 

Это хорошая практика? Это слишком абстрактно?

ответ

2

Что такое метод getSearchFactor(), который только реализован как return this?

Он даже не используется в вашем методе getVehicleFromSearchFactor.

Кроме этого, почему бы и нет. Просто убедитесь, что == - это подходящий способ сравнения ваших поисковых запросов. Для enum s это нормально, но для других объектов .equals(...) может быть лучше ... или даже .appliesTo(...) или таких.

(. Конечно, ваш поиск таким образом, позволяет о не индексации, и имеет O (количество транспортных средств × количества поисковых факторов) временной сложности)

+0

Ya, осознал, что точка (недостаток) «getearchFactor» во время обеда. Что вы подразумеваете под индексированием? – AedonEtLIRA

+1

http://en.wikipedia.org/wiki/Index_(database) –

+0

Спасибо за ссылку, это было полезно. Последнее, если вы не возражаете. Есть ли у вас какие-либо предложения о том, как оптимизировать поиск, чтобы лучше, чем O (N * SF)? – AedonEtLIRA

0

согласен с ответом выше ре: «getSearchFactor()» метод.

В дополнение к ответу выше, мне кажется, что это может быть лучше обработано через любой уровень сохранности, который вы могли бы использовать, или некоторые дополнительные технологии индексирования, такие как Lucene/Solr.