我将如何在没有 if 语句的情况下创建一个回文检查器



我正在尝试创建一个像我之前制作的程序;

它只是给出一个布尔值 true/false on 如果一个字符串向后仍然以相同的方式拼写。

我已经使用 if 语句创建了这个,但也很想知道是否可以仅使用方法和循环创建,如果是这样,如何创建?我寻找了重复项,并且有类似的帖子可以实现我在下面所拥有的内容,但是我找到的所有内容都使用if else语句

一如既往地感谢任何帮助;谢谢。

import java.util.*;
public class testingthingsv24 {
private static Scanner in;
public static void main(String args[])
{
    in = new Scanner(System.in);
    System.out.println("Please Enter Your String: ");
    String n=in.nextLine();
    System.out.println("Your String Was: "+n);
    StringBuffer str=new StringBuffer(n);
    StringBuffer str2=new StringBuffer(str.reverse());
    String s2=new String(str2);
    System.out.println("Reversed Is: "+str2);
    if(n.equals(s2))    
        System.out.println("ITS A PALINDROME");
    else
        System.out.println("ITS NOT A PALINDROME");
}
}

输出:

Please Enter Your String: 
dad
Your String Was: dad
Reversed Is: dad
ITS A PALINDROME

为了测试一个结果,通常一个条件语句(if、三元或switch(似乎很有用。
您必须避免使用条件语句,因为这些条件会使代码不可读、脆弱、容易出错等,从而令人讨厌。

要做到这一点,你必须倾向于抽象而不是顺序逻辑。

例如,在

简单情况下,您可以引入一个结构(键值(,将每个boolean值与String消息相关联。

Map<Boolean, String> messageByBoolean = new HashMap<>();
messageByBoolean.put(true, "ITS A PALINDROME");
messageByBoolean.put(false, "ITS NOT A PALINDROME");
...
System.out.println(messageByBoolean.get(n.equals(s2));

但这真的有意义吗?
它看起来像一个开销,因为你只有两种可能性。
有 5 或 10 个,那就很有意义了。

也想知道是否可以仅使用方法和循环创建,如果是,如何创建?

确定。 if语句在 Java 中是多余的。 该语言中还有许多其他条件,并且有多种方法可以实现if语句的语义(如果需要,包括 else 子句(,而无需实际使用 if 语句。

例如,您可以随时替换

if (condition) {
    // statements when true ...
} else {
    // statements when false ...
}

if_replacement: do {
    while (condition) {
        // statements when true ...
        break if_replacement;
    }
    // statements when false ...
} while (false);

请注意,这与任何特定问题没有任何关联,并且它仅使用循环构造。 如果您不需要else块的模拟,则可以使用更简单的形式。 原则上,你可以用这种形式的结构替换任何程序中的每个if

这实际上无法更有效地实现(例如使用methodfunction(。原因是if-statement

if (n.equals(s2))    
    System.out.println("ITS A PALINDROME");
else
    System.out.println("ITS NOT A PALINDROME");

在处理器级别将简单地评估statementn.equals(s2)true else然后切换到第一个println如果转到第二个println。如果您考虑这一点,实际上没有任何优化可以做,因为此条件始终必须evaluated并且始终必须执行必要的任务(printing)


但是,话虽如此,这是针对这部分代码的最优化的解决方案,您可以在没有大if-else的情况下使code略短且体积更小。

要做到这一点,IMO的最佳解决方案是用ternary表达@shmosel's。这会用一个简单的line替换这个if-else块:

System.out.println(n.equals(s2) ? "ITS A PALINDROME" : "ITS NOT A PALINDROME");

由于 ternary 语句的一般格式,这是有效的:

condition ? task if true : task if false

也可以用递归来完成

boolean isPalindrome (String s) {
    return s.length() < 2 ? true : s.charAt(0) == s.charAt(s.length() - 1) && isPalindrome(s.substring(1,s.length() - 1));
}

最新更新