Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用复杂AND+OR逻辑筛选ArrayList_Java_Android_Arraylist_Guava - Fatal编程技术网

Java 使用复杂AND+OR逻辑筛选ArrayList

Java 使用复杂AND+OR逻辑筛选ArrayList,java,android,arraylist,guava,Java,Android,Arraylist,Guava,我希望能将自定义模型对象的ArrayList筛选为与用户选择的值相匹配的对象。 用户可以以任何方式筛选模型对象的不同字段 如果他们为同一字段选择多个值,例如为类别字段选择早餐和晚餐,则应返回与任何选择匹配的对象。如果他们同时使用蛋白质字段过滤并选择鸡肉,则只应退还鸡肉早餐和晚餐 我目前正在使用番石榴和Collections2.filter…,但似乎无法正确组合and/OR逻辑 任何指导都将不胜感激 编辑:添加代码片段表示我不寻求道义上的支持 Collection<FieldAcceptan

我希望能将自定义模型对象的ArrayList筛选为与用户选择的值相匹配的对象。 用户可以以任何方式筛选模型对象的不同字段

如果他们为同一字段选择多个值,例如为类别字段选择早餐和晚餐,则应返回与任何选择匹配的对象。如果他们同时使用蛋白质字段过滤并选择鸡肉,则只应退还鸡肉早餐和晚餐

我目前正在使用番石榴和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());
            }
        }
    });
}

因此,看起来您需要子定位、技术和组件的交叉点。我移动了一些东西,这些东西应该突出你正在努力解决的问题:

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

你想要什么样的指导?你有具体的问题吗?一些代码与我们分享?或者你只是在寻求精神上的支持?谢谢你添加代码。您还可以解释代码应该做什么以及它当前正在做什么吗?请参阅编辑。我遍历用户应用的每个过滤器,检查FieldAcceptanceLogItem中的字段是否与过滤器的标题匹配。过滤器有三种不同的类别,因此为条件过滤器。在同一类别中应用多个筛选器或逻辑部分不起作用。。。正如所写的,它希望它匹配所有的过滤器,我不知道如何解决这个问题。从一个快速的一瞥,看起来你正在做的是过滤掉所有的东西,除了与mFilters.get0中的第一个过滤器匹配的东西。换句话说,如果mFilters.get0具有子位置A,而mFilters.get1具有子位置B。当第二个谓词开始时,objectFilter不再具有B项,因为它们已被第一个谓词过滤掉。我认为您需要的是3个谓词,而不是mFilters.size谓词。第一个谓词过滤掉不匹配的子位置。第二,过滤掉不匹配的技术。第三,过滤掉不匹配的组件。
new CategoryFilter(mFilters, getString(R.string.component))
    .contains(input.getComponent());