1

これが私のコードです。しかし、うまくいきません。私の問題がどこにあるのか教えてください。それは私にとって非常に複雑です。私のコードは、2 つの入力がアナグラムであるかどうかを検出する必要があります。(例:黙って聞く)

    import java.util.Scanner ;
    import java.lang.String ;
    public class Anagram {

public static void main(String[] args) {
    Scanner scanner = new Scanner (System.in) ;

    System.out.println("Enter your firs word: ");
    String s1= scanner.nextLine() ;
    System.out.println("Enter your second word: ");
    String s2 = scanner.nextLine() ;

    if(isAnagram(s1,s2)){

        System.out.println("Your words are anagram") ;

  }
}

public static boolean isAnagram(String s1, String s2) {

   int a = s1.length() ;
   int b= s2.length() ;
    if (a==b){
        int count=0;
        int i,j ;
        char x, y ;
        for (i=0, j=0; i<=a; i++){

         x = s1.charAt(i) ;

        y = s2.charAt(j);

        j++;
        if (x==y){
            count++ ;
      while (count==a){
          return true;
      }
                    return false;
        }
    }  
    }

}    

}

4

3 に答える 3

3

配列を使用できないため、1 つのアプローチは次のようになります。

public boolean isAnagram(String a, String b) {

    if(a.length() != b.length()) return false;

    for (int i=0; i < a.length(); i++) {
        for (int j=0; j <b.length(); j++) {

            if (a.charAt(i) == b.charAt(j))
            {

               a = removeCharAt(a,i);
               b = removeCharAt(b,j);
                i=0;
                j=0;
            }
        }
    }
    return a.equals(b);
}

removeCharAt は次のとおりです。

public static String removeCharAt(String s, int pos) {
   return s.substring(0,pos)+s.substring(pos+1);

}

最初のテストは、両方の文字列が同じサイズかどうかを確認することです。存在する場合は、最初の文字列から文字を取得することから始め、この文字が 2 番目の文字列に存在するかどうかを確認します。存在する場合は、両方の文字列からこの文字を削除します。そして、最初の文字列から別の文字を取得し、比較する文字がなくなるまでプロセスを繰り返します。最後に、最終結果の文字列が等しい場合、それらはアナグラムです。

string a ="AAAAAA" や string b ="Abbbb" のような例でアナグラムが得られるのを避けるために、両方の文字列の char を削除する必要があります。文字列「a」の各文字は文字列「b」の最初の位置と一致するためです。

コードに問題があります:

public static boolean isAnagram(String s1, String s2) {

   int a = s1.length() ;
   int b= s2.length() ;

if (a==b){
    int count=0;
    int i,j ;
    char x, y ;
    for (i=0, j=0; i<=a; i++){

     x = s1.charAt(i) ;

    y = s2.charAt(j);

    j++;
    if (x==y){
        count++ ;
  while (count==a){
      return true;
  }
                return false;
    }
}  
}

}

i<=afor と . の内部では範囲外エラーが発生しますa = s1.length()。. の場合は何も返されませんif (a!=b)。それに加えて、同じ位置の各文字が等しいかどうかを比較することにより、両方の文字列を比較しています。このアプローチは、アナグラムの検索には機能しません。2 つの文字列が等しいかどうかの検索には機能する可能性があります。

于 2012-12-04T23:14:08.103 に答える
1

おそらく、文字列を並べ替えてから、同じ位置に同じ文字があるかどうかを確認します。これは、java.util.Arrays を使用した簡単なソリューションです。

public static boolean isAnagram(String s1, String s2) {
    char[] string1 = s1.toCharArray();
    char[] string2 = s2.toCharArray();
    Arrays.sort(string1);
    Arrays.sort(string2);
    return Arrays.equals(string1, string2);
}
于 2012-12-04T22:55:22.220 に答える
-2

メソッドでブール型 isAnagram を宣言し、その間にそれを true または false に設定する必要がある場合があります。

boolean isAnagram;

// Do other stuff
      while (count == a) 
      { 
        isAnagram = true;
      }
        isAnagram = false;
      }
      }
    }
    return isAnagram;
 }

そうしないと、コンパイルエラーが発生します

于 2012-12-04T22:56:27.320 に答える