在最近的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
}
我被要求即兴创作上述代码。我给出了答案,它可以通过使用开关即兴创作。但面试官并不满意,并要求采取另一种方法。但我无法解释它。所以我想知道是否有更好的方法来做到这一点。
抱歉问这样一个愚蠢的问题,但我真的想知道答案
答案 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
的东西也可以解决这个问题。但是使用array
或list
实现它也可以很好地工作。
答案 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")
}
更干净,更容易改变条件。