Я бы просто использовал сортируемую коллекцию пользовательских объектов, а затем отфильтровал эту коллекцию на основе предикатов.Я использую Guava для всего этого, но, конечно, есть и другие (обычно более сложные) способы реализовать это.
Вот мой объект Product:
public class Product implements Comparable<Product>{
private final String manufacturer;
private final String model;
private final String platform;
public Product(final String manufacturer,
final String model,
final String platform){
this.manufacturer = manufacturer;
this.model = model;
this.platform = platform;
}
public String getManufacturer(){
return manufacturer;
}
public String getModel(){
return model;
}
public String getPlatform(){
return platform;
}
@Override
public int hashCode(){
return Objects.hashCode(manufacturer, model, platform);
}
@Override
public boolean equals(final Object obj){
if(obj instanceof Product){
final Product other = (Product) obj;
return Objects.equal(manufacturer, other.manufacturer)
&& Objects.equal(model, other.model)
&& Objects.equal(platform, other.platform);
}
return false;
}
@Override
public int compareTo(final Product o){
return ComparisonChain
.start()
.compare(manufacturer, o.manufacturer)
.compare(model, o.model)
.compare(platform, o.platform)
.result();
}
}
Теперь я бы просто использовал TreeSet<Product>
и применил к нему представления.Вот пример метода, который возвращает динамическое представление, отфильтрованное по модели:
public static Collection<Product> filterByModel(
final Collection<Product> products,
final String model){
return Collections2.filter(products, new Predicate<Product>(){
@Override
public boolean apply(final Product product){
return product.getModel().equals(model);
}
});
}
Используйте его следующим образом:
Collection<Product> products = new TreeSet<Product>();
// add some products
Collection<Product> filtered = filterByModel(products, "A1");
Обновление: Мы можем взять егоболее того, используя только одну коллекцию, подкрепленную связанными предикатами, которые, в свою очередь, связаны с моделью, поддерживаемой вашим представлением.Мозг болит?Проверьте это:
// this is the collection you sent to your view
final Collection<Product> visibleProducts =
Collections2.filter(products, Predicates.and(Arrays.asList(
new ManufacturerPredicate(yourViewModel),
new ModelPredicate(yourViewModel),
new PlatformModel(yourViewModel)))
);
yourViewModel
- это объект, который поддерживается значениями, возвращаемыми вашим контроллером формы.Каждый предикат использует поле этого объекта модели, чтобы решить, применяется он или нет.
Например, ModelPredicate
проверяет все продукты в коллекции, чтобы определить, входит ли их модель в число выбранных.Поскольку здесь используется логика and
, вы можете сделать ее иерархической структурой (если предикат производителя возвращает false, предикаты модели и платформы никогда не вызываются).