HOWTO · Java

Javaのアナグラム

このチュートリアルでは、Java で 2つの文字列がアナグラムであるかどうかを調べる方法について説明します。

このページの内容

言葉遊びが好きな方なら、アナグラムという言葉をご存知かもしれません。 2つの文字列に同じ文字が含まれているが、単語が異なる場合、それらは互いのアナグラムと呼ばれます。

たとえば、RaceCare という 2つの単語がある場合、それらを見ると、同じ文字が異なる順序で含まれていることがわかります。

したがって、単語 RaceCare を相互にアナグラムと呼ぶことができます。

この記事では、2つの単語がアナグラムかどうかを調べる方法を説明します。 トピックを簡単にするために、例と説明でトピックをカバーします。

Javaでアナグラムを探す

以下の例では、与えられた 2つの文がアナグラムであるかどうかを確認する方法を示しています。 サンプルコードは次のようになります。

// importing necessary packages
import java.util.Arrays;

public class JavaAnagram {
  static void MatchAnagram(String str1, String str2) {
    String Str_1 = str1.replaceAll("\\s", ""); // Removing the spaces from the first string
    String Str_2 = str2.replaceAll("\\s", ""); // Removing the spaces from the second string
    boolean Status = true;
    if (Str_1.length() != Str_2.length()) { // Checking the length of two string
      Status = false;
    } else {
      // Converting all the characters to lower case and putting the chars of the string into a
      // character
      char[] StringArray1 = Str_1.toLowerCase().toCharArray();
      char[] StringArray2 = Str_2.toLowerCase().toCharArray();
      // Shorting the array.
      Arrays.sort(StringArray1);
      Arrays.sort(StringArray2);
      // Matching both array.
      Status = Arrays.equals(StringArray1, StringArray2);
    }
    if (Status) {
      System.out.println(Str_1 + " and " + Str_2 + " = Anagrams");
    } else {
      System.out.println(Str_1 + " and " + Str_2 + " = Anagrams");
    }
  }

  public static void main(String[] args) {
    MatchAnagram("Keep", "Peek");
    MatchAnagram("Race", "Care");
  }
}

私たちはすでに各行の目的を命じました。 プログラムで従う主な手順は次のとおりです。

  • まず、文からすべてのスペースを削除しました。
  • 次に、2つの文の長さが同じかどうかを調べました。
  • それらが同じ長さの場合、最初にすべての文字を小文字に変換しました。
  • ここで、これら 2つの文のすべての文字を 2つの異なる配列に取り、配列を並べ替えました。
  • 最後に、両方の配列に同じ要素が含まれているかどうかを照合しました。
  • 一致する場合、両方の文はアナグラムです。

サンプルを実行すると、コンソールに次の出力が表示されます。

Keep and Peek = anagrams
Race and Care = anagrams

XORを使用してJavaでアナグラムを見つける

以下の例では、ビットごとの XOR を使用して Java でアナグラムを見つける方法を示します。 コードは次のようになります。

public class JavaAnagram {
  public static void main(String[] args) {
    // Declaring two string
    String STR_1 = "Race";
    String STR_2 = "Care";

    if (AnagramChecking(STR_1, STR_2))
      System.out.println(STR_1 + " & " + STR_2 + " = Anagrams");
    else
      System.out.println(STR_1 + " & " + STR_2 + " = Not Anagrams");
  }

  public static boolean AnagramChecking(String STR_1, String STR_2) {
    // Remove all white spaces, convert to lower case & character array
    char[] StringArr1 = STR_1.replaceAll("\\s", "").toLowerCase().toCharArray();
    char[] StringArr2 = STR_2.replaceAll("\\s", "").toLowerCase().toCharArray();
    if (StringArr1.length != StringArr2.length) // Matching the length
      return false;

    int DoXOR = 0;

    for (int i = 0; i < StringArr1.length; i++) // Performing XOR operation
    {
      DoXOR ^= StringArr1[i] ^ StringArr2[i];
    }

    return DoXOR == 0 ? true : false;
  }
}

各行の目的を示しました。 サンプルコードを実行すると、コンソールに以下の出力が表示されます。

Race & Care = Anagrams

HashMap を使用して Java でアナグラムを検索する

以下の例では、HashMap を使用して Java でアナグラムを見つける方法を示します。 コードは次のようになります。

// importing necessary packages
import java.util.HashMap;

public class JavaAnagram {
  public static void main(String[] args) {
    // Declaring two string
    String STR_1 = "Race";
    String STR_2 = "Care";
    if (AnagramCheck(STR_1.toLowerCase(), STR_2.toLowerCase()))
      System.out.println(STR_1 + " & " + STR_2 + " = Anagrams");
    else
      System.out.println(STR_1 + " & " + STR_2 + " = Not Anagrams");
  }

  public static boolean AnagramCheck(String STR_1, String STR_2) {
    if (STR_1.length() != STR_2.length()) // Matching the length
      return false;
    HashMap<Character, Integer> MyMap = new HashMap<Character, Integer>(); // Declaring a hashmap
    for (int i = 0; i < STR_1.length(); i++) {
      char ch = STR_1.charAt(i);
      if (MyMap.containsKey(ch))
        MyMap.put(ch, MyMap.get(ch) + 1);
      else
        MyMap.put(ch, 1);
    }
    for (int i = 0; i < STR_2.length(); i++) {
      char ch = STR_2.charAt(i);
      if (MyMap.containsKey(ch)) {
        if (MyMap.get(ch) == 1)
          MyMap.remove(ch);
        else
          MyMap.put(ch, MyMap.get(ch) - 1);
      } else
        return false;
    }
    if (MyMap.size() > 0)
      return false;
    return true;
  }
}

サンプルコードを実行すると、コンソールに以下の出力が表示されます。

Race & Care = Anagrams

ここで共有されているコード例は Java であり、システムに Java が含まれていない場合は、環境に Java をインストールする必要があることに注意してください。