比较对象中的两个以上条件

时间:2014-07-28 03:46:03

标签: java functional-programming

这更像是一个编程/逻辑问题。可以使用任何编程语言来解答(我希望使用C / C ++ / Java / python,其他我可能不理解)。

for(int i = 0 ; i < partsModelMasterList.size() ;i++)
            {
                PartsModel partsModel = partsModelMasterList.get(i);

                // compare model
                if(filterModel != null &&  partsModel.getPartModel().equalsIgnoreCase(filterModel))
                {
                    partsModelList.add(partsModel);
                }
                // compare product name
                else if(filterProduct != null && partsModel.getPartName().equalsIgnoreCase(filterProduct))
                {
                    partsModelList.add(partsModel);
                }
                // compare filterDescription
                else if(filterDescription != null && partsModel.getPartSpecs().contains(filterDescription))
                {
                    partsModelList.add(partsModel);
                }
            }

在这里,您可以看到我以不同的方式比较每个字段。

因此,当任何字段符合标准时,它将被添加到数据结构中。我不想要除非它也满足其他人。但与此同时,用户可能会将某些字段留空,这使得其中一些字段为null

假设它满足1但不满足2它应该被拒绝。

解决问题的最佳解决方案是什么。或者我必须做9(或者其他,我不擅长数学)ifs for 3比较。

3 个答案:

答案 0 :(得分:4)

您应该使用And运算符&&作为

  

因此当任何一个字段符合标准时,它就会被添加到   数据结构。我不想要除非它也满足其他人。   假设它满足1但不满足2它应该被拒绝。

if((filterModel != null &&  partsModel.getPartModel().equalsIgnoreCase(filterModel)) &&
                (filterProduct != null && partsModel.getPartName().equalsIgnoreCase(filterProduct)) &&
                (filterDescription != null && partsModel.getPartSpecs().contains(filterDescription)))
            {
                partsModelList.add(partsModel);
            }

答案 1 :(得分:1)

这取决于您的背景。如果您想比较多个条件并确保所有条件都通过,您应该使用logical and之类的

if (partsModel != null) {
  if (partsModel.getPartModel().equalsIgnoreCase(filterModel) 
      && partsModel.getPartName().equalsIgnoreCase(filterProduct) 
      && partsModel.getPartSpecs().contains(filterDescription)) {
    partsModelList.add(partsModel);
  }
}

如果需要两个或更多个和/或您依赖多个测试用例,您可能更喜欢fuzzy logic -

int pCount = 0;
if (partsModel != null) {
  if (partsModel.getPartModel().equalsIgnoreCase(filterModel)) pCount++;
  if (partsModel.getPartName().equalsIgnoreCase(filterProduct)) pCount++; 
  if (partsModel.getPartSpecs().contains(filterDescription)) pCount++;
}
if (pCount > 2) { // <-- or whatever your criteria is
  partsModelList.add(partsModel);
}

答案 2 :(得分:1)

您可以将所有条件放在@Sanjeev建议的单一if语句中。但是,如果您有许多条件,这可能会变得难以阅读。

您也可以反转每个条件,并跳过列表中当前迭代的其余部分。如果您有if (a != null && a.equals(,则逆变为if (a == null || !a.equals(

然后您的代码变为:

    for (int i = 0; i < partsModelMasterList.size(); i++) {
        PartsModel partsModel = partsModelMasterList.get(i);

        // compare model
        if (filterModel == null || !partsModel.getPartModel().equalsIgnoreCase(filterModel)) {
            continue;
        }
        // [...] Other two conditions removed for brevity

        partsModelList.add(partsModel);
    }

但在这种典型的过滤方式中,你想要的是:

  

结合用户输入值的所有条件,但是   如果用户尚未输入值,则不要对其进行过滤   条件。

要实现这一点,只有当用户输入了该特定条件的值时,您才能跳过当前迭代的其余部分,该值与您当前的对象不匹配检查。然后你的代码变成:

    for (int i = 0; i < partsModelMasterList.size(); i++) {
        PartsModel partsModel = partsModelMasterList.get(i);

        // compare model
        if (filterModel != null && !partsModel.getPartModel().equalsIgnoreCase(filterModel)) {
            continue;
        }
        // compare product name
        else if (filterProduct != null && !partsModel.getPartName().equalsIgnoreCase(filterProduct)) {
            continue;
        }
        // compare filterDescription
        else if (filterDescription != null && !partsModel.getPartSpecs().contains(filterDescription)) {
            continue;
        }
        partsModelList.add(partsModel);
    }

我在代码中使用了超过15个条件的构造,我认为这是保持可读性的好方法。