我希望将自定义模型对象的ArrayList过滤到匹配用户选择的值。 用户可以以任何方式过滤模型对象的不同字段......
如果他们为同一个字段选择多个值(例如,为"类别"字段选择早餐和晚餐),则应返回与任何选项匹配的对象。如果他们同时过滤使用"蛋白质"现场并选择" chicken"只应退回鸡肉早餐和晚餐。
我目前正在使用Guava和Collections2.filter(...),但似乎无法正确组合AND / OR逻辑。
任何指导将不胜感激! :)
编辑:添加代码段作为我不寻找的指示"道德支持"
Collection<FieldAcceptanceLogItem> objectFilter = allLogItems;
for (final Filter filter : mFilters) {
objectFilter = Collections2.filter(objectFilter, new Predicate<FieldAcceptanceLogItem>() {
@Override
public boolean apply(@javax.annotation.Nullable FieldAcceptanceLogItem input) {
if (filter.getCategory().equalsIgnoreCase(getString(R.string.sublocation))) {
return input.getSublocation().equalsIgnoreCase(filter.getTitle());
}
else if (filter.getCategory().equalsIgnoreCase(getString(R.string.technology))) {
return input.getTechnology().equalsIgnoreCase(filter.getTitle());
}
else { //(filter.getCategory().equalsIgnoreCase(getString(R.string.component)))
return input.getComponent().equalsIgnoreCase(filter.getTitle());
}
}
});
}
答案 0 :(得分:0)
所以看起来你想要的是子位置,技术和组件的交集。我动了几件事,应该突出你想要解决的问题:
objectFilter = Collections2.filter(objectFilter, new Predicate<FieldAcceptanceLogItem>() {
@Override
public boolean apply(@javax.annotation.Nullable FieldAcceptanceLogItem input) {
return SublocationFilters.from(mFilters).contains(input.getLocation())
&& TechnologyFilters.from(mFilters).contains(input.getTechnology())
&& ComponentFilters.from(mFilters).contains(input.getComponent());
});
SublocationFilters.from(...)
将为您提供所有子位置过滤器TechnologyFilters.from(...)
将为您提供所有技术过滤器ComponentFilters.from(...)
将为您提供所有组件过滤器contains(...)
只是做“filter_1 OR filter_2 OR ... filter_n”的便捷方法如果你确实想要遵循这种模式,我建议你做更多这样的事情,因为它更少编写测试:
new CategoryFilter(mFilters, getString(R.string.component))
.contains(input.getComponent());