Java:如何即兴创作if-else语句

Java:如何即兴创作if-else语句,java,if-statement,switch-statement,Java,If Statement,Switch Statement,在最近的java访谈中,询问了关于if-then-else的问题,并提出了这样一个问题:如果给您1000个if-else条件,比如 if(condition 1){ task 1 }else if (condition 2){ task 2 }else if (condition 3){ task 3 } ... else if (condition 1000){ task 1000 } 我被要求即兴编写上述代码。我回答说可以用开关即兴创作。

在最近的java访谈中,询问了关于if-then-else的问题,并提出了这样一个问题:如果给您1000个if-else条件,比如

if(condition 1){
      task 1
}else if (condition 2){
      task 2 
}else if (condition 3){
      task 3
}
...
else if (condition 1000){
      task 1000 
}
我被要求即兴编写上述代码。我回答说可以用开关即兴创作。但面试官并不满意,要求另一种方法。但我无法解释。因此,我想知道是否有更好的方法来做到这一点


很抱歉问这样一个愚蠢的问题,但我真的想知道答案

如果条件是数值比较,您可以创建(或接收)一个方法列表,以及要执行的方法的索引。 这样,您就消除了所有if和else,只需调用
方法[somePosition].Invoke()


PS:上面的代码不是java,它只是一个可以在任何语言中应用的示例。

使用哈希表方法键入您的条件,而不是检查每个条件。散列是顺序1,因此它比通过if语句检查所有条件要快。

多个if语句可以通过switch语句得到改进有时,switch语句看起来会更好一些

然而,这些事情最终都是粉饰。代码中的一长串条件通常意味着存在设计缺陷。面试官可能一直在寻求对此的赞赏

你本可以说条件句可能是

考虑这一点:

 // Bad implementation that replies on condtionals
public static void Print(string animal, string quote){

    switch(animal){
        case "Dog":
            Console.WriteLine("the dog woofed " + quote);
        return;
    case "Cat":
            Console.WriteLine("the cat meowed " + quote);
        return;
    }

}

// Better implementation that pushes the detail of how animals talk into an animal object
public static void BetterPrint(Animal animal, string quote){
    Console.WriteLine(animal.Speak(quote));
}


public interface IAnimal{

    string Speak(string quote);

} 

通过更好的设计,条件句已经消失了。一般来说,在OO编程中,您希望行为从对象交互中产生,而不是充满开关和ifs的长方法。

有很多方法可以做到这一点。我们实际上可以把它变成一个
O(1)
操作。怎么用?使用数组

class Runner(){
    public static void main(String[] args){
        Task[] taskList = new Task[1000];
        //init taskList and fill it with tasks first

        Task taskToDo = taskList[condition];
        taskToDo.execute();
    }
}

class Task{
    public void execute(){
         //code for each task
    }
}

还有一种称为
命令模式的方法也可以解决这个问题。但是用
数组
列表
实现它也很好。

解决此类问题的标准方法是使用字典和

然而,这需要您有一个简单的映射条件x->key x,这可能是可能的,也可能是不可能的,这取决于用例。您仍然可以以更可扩展的方式封装条件:

interface ConditionalCommand  
    extends Runnable
{
     boolean isApplicable(conditionParams...);        
}
其中
isapplicate()
测试运行
condition命令的前提条件是否满足

List<ConditionalCommand> commands;

如何获取和存储命令列表取决于您。甚至可以从数据库或类似的数据库中提取命令。

最好的解决方案取决于“条件”的格式,但如果恰好是,例如,条件是1到1000的整数(或更一般地形成某个时间的字典),则可以形成一个映射,例如映射。然后您的代码将简化为

if(map.contains(condition)){
    map.get(condition).doTask()
} else {
    throw new Exception("Condition has no associated task")
}

这更干净,更容易改变条件。

从面试官的角度考虑,这个问题的目的是得到一个接下一个问题的答案

下面是使用集合改进的一种方法。对于java访问泛型自动装箱将是一个很好的选择,下面的答案正好包括这一点。您可以通过各种方式进行改进,但以下是一个答案

 List<Integer> myRnage = new ArrayList<Integer>(1000);
 for(Integer theIndex : myRnage) {
     //do the task for theIndex at this point.
 }
List myRnage=new ArrayList(1000);
对于(整数索引:myRnage){
//此时执行索引的任务。
}
或者,同样的问题也可以通过使用Apache库的代码来解决 演示
范围
实用程序的使用。以下是关于这一点和更多的建议


在这种情况下,“即兴创作”是什么意思?另外,可能的dup您的意思是改进吗?请确切说明您希望改进的内容。表演浪漫?可读性?可维护性?对我来说,这看起来像是@user34034462的典型案例。任务是什么?阅读价值观?或者它可以是任何东西?@dhke你的链接是为了另一个问题。在这个链接中,唯一的条件是对象相等,而在OP中,它是另一个条件,可以是任何东西。就我个人而言,我会将所有条件放入数据库,并使用一些规则引擎。但这绝对不是“面试”答案。正如评论中所指出的,如果条件可以很容易地变成一个(数字)键,而这个键在问题中并不清楚。@dhke Bravo!你说得对。。。
 List<Integer> myRnage = new ArrayList<Integer>(1000);
 for(Integer theIndex : myRnage) {
     //do the task for theIndex at this point.
 }