Java:如何即兴创作if-else语句
在最近的java访谈中,询问了关于if-then-else的问题,并提出了这样一个问题:如果给您1000个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 } 我被要求即兴编写上述代码。我回答说可以用开关即兴创作。
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.
}