哪个是更合理的递归助手方法?

时间:2012-12-22 05:49:32

标签: java methods recursion helper

我的任务是编写一个类的方法,我测试用户输入的回文。该类必须具有递归方法,并且该方法必须调用一个帮助方法来删除空格,标点符号并忽略大小写。

我有两个工作类来做这些事情,但我想知道哪个结构更好用,哪个辅助方法实际上适合帮助方法的描述。

这是第一堂课:

public class RecursivePalindrome
{

public boolean Palindrome(String s)
{
    return PalindromeHelper(s);
}

public boolean PalindromeHelper(String s)
{
    String a = s.toLowerCase();    //Converts any capital letters to lowercase beforte analyzing the string
    a = a.replaceAll(" ", "");    //Removes any and all spaces in the string

    for(int i = 0; i < a.length(); i++)     //Removes punctuation by using isLetter method from Character Class
    {
        if(Character.isLetter(a.charAt(i)) == false)
            a = a.replace(a.substring(i, i+1), "");
    }

    if(a.length() == 0 || a.length() == 1)
        return true;
    else if(a.charAt(0) == (a.charAt(a.length() - 1)))
        return PalindromeHelper(a.substring(1, a.length() - 1));
    else
        return false;
}
}

第二个:

public class Recurs
{

public boolean Palindrome(String s)
{
    String l = PalindromeHelper(s);

    if(l.length() == 0 || l.length() == 1)
        return true;
    else if(l.charAt(0) == (l.charAt(l.length() - 1)))
        return Palindrome(l.substring(1, l.length() - 1));
    else
        return false;
}

public String PalindromeHelper(String s)
{
    s = s.toLowerCase();    //Converts any capital letters to lowercase before analyzing the string
    s = s.replaceAll(" ", "");    //Removes any and all spaces in the string

    for(int i = 0; i < s.length(); i++)     //Removes punctuation by using isLetter method from Character Class
    {
        if(Character.isLetter(s.charAt(i)) == false)
            s = s.replace(s.substring(i, i+1), "");
    }
    return s;
}
}

2 个答案:

答案 0 :(得分:0)

我会这样写。

class RecursivePalindrome
{

    public boolean Palindrome(String s)
    {
        //Think about using a stringbuilder instead of a string.

        String a = s.toLowerCase(); // Converts any capital letters to lowercase
                                    // beforte analyzing the string
        a = a.replaceAll(" ", ""); // Removes any and all spaces in the string

        for (int i = 0; i < a.length(); i++) // Removes punctuation by using
                                             // isLetter method from Character
                                             // Class
        {
            if (Character.isLetter(a.charAt(i)) == false)
                a = a.replace(a.substring(i, i + 1), "");
        }
        return validatePalindrome(a);
    }

    public boolean validatePalindrome(String s)
    {
        if (s.length() == 0 || s.length() == 1)
            return true;
        else if (s.charAt(0) == (s.charAt(s.length() - 1)))
            return PalindromeHelper(s.substring(1, s.length() - 1));
        else
            return false;
    }
}

答案 1 :(得分:0)

在我们开始使用代码之前的一些事情......

“帮助程序”方法通常称为实用程序方法,它是无状态代码段 - 无状态:

  • 应将其声明为static

遵循java命名约定是个好主意,所以:

  • 方法名称以小写字母开头
  • 如果合理的话,
  • 布尔方法以is开头

因此,您的“帮助”方法应如下所示:

private static String clean(String s) {
    return s.toLowerCase().replaceAll("[^a-z]", "");
}

此方法可以完成您的方法所做的一切,但只需要一小部分代码。

因为你的main方法也是无状态的,所以它也应该是静态的,除非由于类层次结构或接口等而需要它是一个实例方法。

因此,您的主要方法应该是:

public static boolean isPalindrome(String s) {
     return isPalindromeClean(clean(s));
}

private static boolean isPalindromeClean(String s) {
    return s.length() < 2 || a.endsWith(s.charAt(0)) && 
        isPalindromeClean(l.substring(1, l.length() - 1));
}

同样,一行代码完成所有工作。有些事情需要注意:

  • 您的代码调用“干净”方法每次递归,但通过创建第二种方法,我可以避免这种低效率。
  • 使用endsWith()简单并澄清条件
  • 使用封装逻辑的单个简单return语句

全班成为以下,只有3行实际代码。

public class Recurse {

    public static boolean isPalindrome(String s) {
         return isPalindromeClean(clean(s));
    }

    private static boolean isPalindromeClean(String s) {
        return s.length() < 2 || a.endsWith(s.charAt(0)) && 
          isPalindromeClean(l.substring(1, l.length() - 1));
    }

    private static String clean(String s) {
        return s.toLowerCase().replaceAll("[^a-z]", "");
    }
}

即使采用干净的方法,我也不会打扰 - 我会像这样插入它:

public static boolean isPalindrome(String s) {
    return isPalindromeClean(s.toLowerCase().replaceAll("[^a-z]", ""));
}

但是如果你已经设置了一个分配,说你必须创建它,那么你就会坚持下去。我会展示这个替代方案。

通常,代码越优雅,代码越少。