0

私は、2 つの単語または句を取り込んで、Unicode 値が一致するかどうかを確認することで、それらがアナグラムであるかどうかをテストするプログラムを作成しようとしています。メソッド「検索」は、それらが同じ長さである場合にのみ実行されます..問題がありましたが、解決されました.

改訂版は次のとおりです。

コードのレイアウト方法のスタイルについてどうお考えですか。それは明らかですか?別の方法で行う必要がありますか?それとも読みやすいと思いますか?他の人にわかりやすく伝える方法について何かアドバイスはありますか?

コメントを追加する場合、それらは短くする必要がありますか、それとも複数行のコメントでその部分がどのように機能するかを説明する必要がありますか?

私はできるだけ簡単に見えるようにしたいと思っていますが、それについての本当のアドバイスはほとんど得られていません。

import java.util.Scanner;

public class AnagramCount {

   public static void main(String[] args) {
   System.out.println("Please enter two words, one per line, to test if it is an anagram");
   Scanner userInput = new Scanner(System.in);
   String word1 = userInput.nextLine();
   String word2 = userInput.nextLine();
   int count = 0;
   int[] char_code = new int[word1.length()];
   int[] char_code2 = new int[word2.length()];
   char[] temp = word2.toCharArray();
   boolean match = true;

   if (word1.length() == word2.length()){
      search(word1, word2, count, char_code, char_code2, match, temp);
      if (match == true){
         if (char_code[word1.length()-1] == 0){
            match = false;
         }
      else {
      // if match remains true after this final check, information about it will print
         System.out.print("word1 unicode values: ");
         for(int i = 0; i < word1.length(); i++){
            System.out.print(char_code[i] + " ");
         }
         System.out.println();
         System.out.print("word2 unicode values: ");
         for(int i = 0; i < word1.length(); i++){
            System.out.print(char_code2[i] + " ");
         }
      }
   }
}
   else {
      match = false;
   }
   System.out.println("\n" + "Anagram? t/f?: " + match);
}

public static void search(String word1, String word2, int count, int[] char_code, int[]   char_code2, boolean match, char[] temp)
{
   StringBuilder word1check = new StringBuilder(word1);
   StringBuilder word2check = new StringBuilder(word2);
   int word1_unicode = 0;
   int word2_unicode = 0;

   if(count >= word1.length()) 
      return;

   else
   {      
      for(int i = 0; i < word2.length(); i++){         
         if (word1.charAt(count) == word2.charAt(i)){

         word1_unicode = word1check.codePointAt(count);
         char_code[count] = word1_unicode;  

         temp[i] = 0;
         String str = new String(temp);
         word2 = str;

         word2_unicode = word2check.codePointAt(i);
         char_code2[count] = word2_unicode; 

   if(count==word1.length()-1)
     break;

  search(word1, word2, ++count, char_code, char_code2, match, temp);

     }
  }   

}
  return;
}
}
4

1 に答える 1

1

あなたの問題は、あなたが考えている場所ではなく、使用している再帰で発生します。メソッド「search」を呼び出す前に、count 変数をインクリメントします。

search(word1, word2, ++count, char_code, char_code2, match);

これを修正する最も簡単な方法は、メソッドを呼び出す直前にチェックを追加することです。

if(count==word1.length()-1)
    break;
search(word1, word2, ++count, char_code, char_code2, match);

この方法では、count が単語の末尾に達した場合に検索メソッドを呼び出さず、範囲外に出てそれを破ることができません。

テスト中に見つけた別の問題はここにあります

for(int i = 0; i < word1.length()-1; i++)

この方法では、検索中に 2 番目の単語の末尾に到達することはありません。2 番目の単語が単語内で 1 回しか使用されない文字で終わっている場合は、ここには入りません。

if (word1.charAt(count) == word2.charAt(i)){
// I think the problem is right around here, but I don't know what to change 

    word1_unicode = word1check.codePointAt(count);
    char_code[count] = word1_unicode; 

    if(char_code2[count] == 0) { //prevents double counting of letters
        word2_unicode = word2check.codePointAt(i);
        char_code2[count] = word2_unicode;
        search(word1, word2, ++count, char_code, char_code2, match);
    } 

    if((count==0)&&(i == word1.length()-1)){
        match = false;
    }
}

これを修正するために、「for」ループの「-1」を削除しました。

このメソッドの最後の奇妙な問題は、プログラムの開始時に事前に定義したブール型を実際に返し、実際には false になるポイントに到達しないことです。この時点で、二重カウント防止も機能しないことがわかりました。基本的に、ラインの約半分は実際には何もしていませんでした。

プログラムで見つけた問題を修正することで、あなたのお役に立てば幸いです。この時点で、最初の単語のすべての文字が 2 番目の単語にある場合、2 つの単語はアナグラムであると言われます。単語の二重カウントを防ぐために考えられる最も簡単な方法は、この位置の文字を単純に上書きすることです。

文字の二重カウントを防ぐための私のアイデアで実際にうまく機能していたコードは次のとおりです。

import java.util.Scanner;

public class test {

public static void main(String[] args) {

System.out.println("Please enter two words, one per line, to test if it is an anagram");
Scanner userInput = new Scanner(System.in);
String word1 = userInput.nextLine();
String word2 = userInput.nextLine();
int count = 0;
boolean match = true;

    if (word1.length() == word2.length()){
        match = search(word1, word2, count,match);
    }
    else {
        match = false;
    }

    if(match)
        System.out.println("The words are anagrams");
    else
        System.out.println("The words are not anagrams");
}

    public static boolean search(String word1, String word2, int count,boolean match)
    {

        if(count >= word1.length()-1) 
            return match;

        else
        {
            for(int i = 0; i < word1.length(); i++)
            { 

                if (word1.charAt(count) == word2.charAt(i)){
                    char[] temp = word2.toCharArray();
                    temp[i] = 0;
                    word2 = temp.toString();
                    search(word1, word2, ++count, match);
                } 
                else
                    match = false;
            }
        }
        return match;

    }
}
于 2012-11-18T00:14:10.623 に答える