Java:如何即兴发表else语句

时间:2015-06-20 20:53:49

标签: java if-statement switch-statement

在最近的java面试问题中,如果问其他人是否被提出问题,那么问题是如果你被给予1000 if else else条件

if(condition 1){
      task 1
}else if (condition 2){
      task 2 
}else if (condition 3){
      task 3
}
...
else if (condition 1000){
      task 1000 
}

我被要求即兴创作上述代码。我给出了答案,它可以通过使用开关即兴创作。但面试官并不满意,并要求采取另一种方法。但我无法解释它。所以我想知道是否有更好的方法来做到这一点。

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

7 个答案:

答案 0 :(得分:1)

从面试官的角度思考,问题的目的是得到一个明确到下一个问题的答案

以下是改善收藏的一种方法。对于java面试 Generics Autoboxing 将是一个很好的segue,以下答案包含了这一点。您可以通过各种方式对其进行改进,但以下内容将是一个答案。

 List<Integer> myRnage = new ArrayList<Integer>(1000);
 for(Integer theIndex : myRnage) {
     //do the task for theIndex at this point.
 }
  

或者,使用Apache库可以使用代码来回答相同问题   演示Range实用程序的使用。这是SO link以及更多。

答案 1 :(得分:0)

如果条件是数字比较,则可以创建(或接收)方法列表以及要执行的方法的索引。 这样,你消除了所有的if和elses并简单地调用 methods[somePosition].Invoke()

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

有时,switch语句可以改进多个if语句,switch语句可以看起来好一些。

然而,这些东西最终是装饰窗户。代码中的一长串条件通常意味着存在设计缺陷。面试官可能一直在寻找对此的欣赏。

你可能已经建议条件可能是replaced with polymorphism

考虑一下:

 // 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);

} 

通过更好的设计,条件已经消失。通常,在面向对象编程中,您希望行为从对象交互中产生,而不是使用填充开关和ifs的长方法。

答案 4 :(得分:0)

有很多方法可以做到这一点。我们实际上可以将其作为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
    }
}

还有一种叫做Command Pattern的东西也可以解决这个问题。但是使用arraylist实现它也可以很好地工作。

答案 5 :(得分:0)

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

然而,这需要你有一个简单的映射条件x - &gt;密钥x 根据用例可能会或可能不会。您仍然可以以更可扩展的方式封装条件:

interface ConditionalCommand  
    extends Runnable
{
     boolean isApplicable(conditionParams...);        
}

其中isApplicable()测试是否符合运行ConditionCommand的前提条件。

List<ConditionalCommand> commands;

然后可以压缩多个ifs以循环遍历命令列表:

for (ConditionalCommand cmd: commands) {
   if (cmd.isApplicable(params)) {
      cmd.run();
      break; // or not, which allows multiple commands to be run
   }
}

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

答案 6 :(得分:0)

最好的解决方案略微取决于“条件”的格式,但如果它恰好发生了,例如,条件是整数1到1000(或更一般地形成一段时间的字典),然后你可以形成一个例如地图。然后你的代码减少到

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

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