1

私の任務は、ユーザーが入力する回文をテストするクラスのメソッドを作成することです。クラスには再帰メソッドが必要であり、そのメソッドは、スペースと句読点を削除し、大文字と小文字を区別しないヘルパーメソッドを呼び出す必要があります。

これらのことを行う2つの労働者階級がありますが、どちらの構造がより適切に機能し、どのヘルパーメソッドが実際にヘルパーメソッドの説明に適合するのか疑問に思っています。

これがファーストクラスです:

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

そして2番目のもの:

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

2 に答える 2

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;
    }
}
于 2012-12-22T06:08:34.073 に答える
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));
}

繰り返しますが、1 行のコードですべてを実行できます。注意すべき点:

  • コードは再帰ごとに「クリーン」メソッドを呼び出しますが、2 番目のメソッドを作成することで、この非効率性を回避します。
  • 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]", "");
    }
}

clean メソッドを使用することさえ気にしません。次のように単純にインライン化します。

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

しかし、作成しなければならないという課題が設定されている場合は、それに固執しています。ただし、この代替案を示します。

通常、コードが洗練されているほど、コードは少なくなります。

于 2012-12-22T10:46:55.033 に答える