2012-12-22 42 views
1

我的任务是写一个类的方法,我测试用户输入的回文。该类必须具有递归方法,并且该方法必须调用一个帮助器方法,该方法可以删除空格,标点符号并忽略大小写。哪一种更合理的递归辅助方法?

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

这里的第一类:

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; 
} 
} 
+0

第二个impl。适合“帮助者的方法,删除空格,标点符号,并忽略案件”显然 – 2012-12-22 05:52:48

+0

有什么办法让第二个更有效?每当Palindrome重复出现时,它会在第一次调用帮助程序后调用不需要的帮助程序方法。 –

+0

然后,只需将PalindromHelper()调用下的所有内容都拉入新方法(例如PalindromRecurse()),然后递归调用它。 –

回答

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; 
    } 
} 
0

几件事情之前,我们得到的代码...

一个“助手”方法更通常称为实用方法,这是一个无状态一块代码 - 幸福无状态:

  • 应该被声明为static

秉承Java命名约定是一个好主意,所以:

  • 方法的名称以小写字母
  • 布尔方法的开始is如果有理由这样

所以,你的“帮手“方法应该看起来像这样:

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

此方法执行您的方法所做的一切,但在一小部分代码中。

因为你的主要方法,也是无状态的,它也应该是静态的,除非它需要是因为类层次结构或接口等的实例方法

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

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]", "")); 
} 

但如果你已经设置说你必须创建一个作业那么你就会陷入困境。但我会展示这个选择。

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