Java 根据几个参数处理许多条件的模式是什么?

Java 根据几个参数处理许多条件的模式是什么?,java,parameters,conditional,Java,Parameters,Conditional,这不是我第一次遇到这个问题,当然也不会是最后一次。当用户有多个选项可供选择时,应该有比执行无数IF语句更有效的方法,并且该用户为多个变量提供输入,但不为其他变量提供输入,尽管我们需要为其他未选择的变量做一些工作,而他们的未选择状态需要一些工作 5带有子选项的选项意味着我们的IF语句数量急剧增加,我不确定SWITCH是否适用,因为仍然需要比较逻辑,所以我们仍然需要在使用SWITCH之前以某种方式评估变量,这同样是IF 如果您已经了解了范围,请提供您对要执行的模式或解决方案的见解,以便更有效地处理这

这不是我第一次遇到这个问题,当然也不会是最后一次。当用户有多个选项可供选择时,应该有比执行无数IF语句更有效的方法,并且该用户为多个变量提供输入,但不为其他变量提供输入,尽管我们需要为其他未选择的变量做一些工作,而他们的未选择状态需要一些工作

5带有子选项的选项意味着我们的IF语句数量急剧增加,我不确定SWITCH是否适用,因为仍然需要比较逻辑,所以我们仍然需要在使用SWITCH之前以某种方式评估变量,这同样是IF

如果您已经了解了范围,请提供您对要执行的模式或解决方案的见解,以便更有效地处理这些情况?如果你没有,我准备了一个例子来更好地解释。这是我们都遇到过的一个非常普遍的问题,所以如果你觉得自己不明白,请不要忽视——我可能真的不善于解释

我的第一个示例非常长,但与更新用户详细信息有关(预填充表单+验证)。当用户提交一些参数而不是全部参数时,我们不希望触发对这些字段的验证,比如说保持不变。简而言之,这会生成许多嵌套的IFs

现在,第二个例子,我希望它能消除我问题周围的所有困惑。考虑简单的HTML表。在我们的表中,有四列名称:

事件名称|事件类型|偶数开始日期|事件结束日期

在我的场景中,我应该允许按两个字段进行排序

作为一个用户,我可以为您生成4X3=12排序案例,只需使用任意两个字段即可

有了三个,它将增长到4x3x2=24

显然,没有IF或SWITCH语句可以拯救我们(很简单)。事实上,我很少使用SWITCH语句和asfaik,至少在java中,它是非常有限的,允许通过整数或字符串进行切换

但SWITCH有趣的一面是,在向它传递变量之前,我必须首先评估它们。因此,从HTML表单中,我提交了两个变量sortByParamOne=NAME sortByParamTwo=TYPE

那么我必须声明:

if(sortByParamOne.equals("NAME")&&sortByParamTwo.equals("TYPE"))

case = 1

else if ...

case = 2

else if ...
总共12倍,如果只是为了准备变量

一种或另一种开关只在单一输入下工作,当我们有两个参与者变量承担不同的角色时,它似乎没有什么帮助。如果我错了,请纠正我

如果不使用大量的IFs,如何处理这种情况,保持代码简洁明了?这似乎是一种数学领域,而不是设计模式或我们的编程策略,甚至可能与集合论有关,就像在SQL中,我们可以以任何可以想象的方式使用任何数量的参数进行排序一样。


我认为在一本“Spring”frmwrk的书中,他们专门用了整整一章的篇幅来讨论这个关于表格的多重排序示例问题。可能是另一个图书馆,它很少说明事物是如何工作的。我没有它,所以无法进行查找。

除了俱乐部条件的一般技术外,使用switch语句、反射API,我建议您考虑如何使代码模块化。您可以将代码划分为更小的方法,并可以减少编写的条件数。。尽可能重复使用方法。始终尝试以通用的方式编写方法,以实现可重用性

很多理论,现在让我们来看一些例子。假设您需要找到三个数字中最大的一个。这就是我们在不使用模块化方法的情况下编写它的方式:

public int largest(int first, int second, int third) {
   int largest = first;
   if ( second > largest )
       largest = second;
   else if (third > largest)
       largest = third;
}
现在使用方法重新编写它

public int largest(int first, int second, int third) {

 return largest(first,largest(second,third));
}

public int largestOfTwo(int first, int second) {
    int largest = first;
    if( second > largest)
       largest = second;
    return largest;
}

差异应在上述样本中可见。如果不是这样,我就无法证明我的理论:-(

让我们以排序为例。尽管用户希望排序的顺序有很多种可能性,但它们都是对称的。这意味着,排序的字段实际上并不重要,因为您将对其应用相同的方法

因此,假设您必须编写一个自定义比较器来执行排序。我将执行以下操作:

public CustomComparator implements Comparator<TableRow> {
    // this will contain the column names that the table will be sorted by, in order
    // eg. "NAME", "TYPE", "STARTDATE"
    private List<String> conditions;

    public CustomComparator(List<String> cond) { conditions = cond; }

    public int compare(TableRow row1, TableRow row2)
    {
        for (String condition : conditions)
        {
            int result = row1.getColumn(condition).compareTo(row2.getColumn(condition));
            if (result != 0) return result;
        }
        return 0;
    }
}
公共CustomComparator实现Comparator{
//这将包含表将按顺序排序的列名
//例如“名称”、“类型”、“起始日期”
私人名单条件;
公共CustomComparator(列表条件){conditions=cond;}
公共整数比较(表行第1行、表行第2行)
{
for(字符串条件:条件)
{
int result=row1.getColumn(条件).compareTo(row2.getColumn(条件));
如果(result!=0)返回结果;
}
返回0;
}
}

当然,上面的例子假设所有的列都是可比较的,我刚刚想到了另一个好例子,CHESS ENGINE!也许我需要了解一下,因为他们没有在那里写数十亿个If,我想?:-)我同意你对少量选项和条件的解决方案。这将清理我们的代码,比如说大约24个案例。但是如果我有8列和3个变量排序标准呢?8*7*6=336个案例-我们会失去耐心:-)