我的任务是编写一个类的方法,我测试用户输入的回文。该类必须具有递归方法,并且该方法必须调用一个帮助方法来删除空格,标点符号并忽略大小写。
我有两个工作类来做这些事情,但我想知道哪个结构更好用,哪个辅助方法实际上适合帮助方法的描述。
这是第一堂课:
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 :(得分: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()
简单并澄清条件全班成为以下,只有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]", ""));
}
但是如果你已经设置了一个分配,说你必须创建它,那么你就会坚持下去。我会展示这个替代方案。
通常,代码越优雅,代码越少。