Сравнение двух слов

Я новичок на форуме (как зарегистрированный пользователь), поэтому очень старался (клянусь!) не задавать вопрос, а искать старые ответы, и проверял чужие ошибки в похожих на мою проблемах, но не смог Ничего страшного.

Мой код здесь должен проверять, является ли слово анаграммой другого слова или нет. Я почти уверен, что сильно усложнил себе жизнь, и были бы более простые способы сделать это, но... Я работаю над этим уже некоторое время и хотел бы увидеть, как это работает...

Любая идея, почему это не так?

Все, что я вижу, это пустые словари, и два слова всегда являются анаграммами, когда они имеют одинаковое количество букв (это означает, что на самом деле мои словари ничего не делают: '( )

import acm.program.ConsoleProgram;
import java.util.*;


public class Anagrams extends ConsoleProgram {

    String firstWord;
    String secondWord;

    public boolean checkLength(String firstWord, String secondWord) {
        if (firstWord.length() == secondWord.length()) {
            println("Same length!");
            return true;
        } else {
            return false;
        }
    }

    public boolean anagram(String firstWord, String secondWord) {
        firstWord = firstWord.toLowerCase();
        secondWord = secondWord.toLowerCase();
        String[] firstArray = firstWord.split("\\a");
        String[] secondArray = secondWord.split("\\a");
        int firstLength = firstWord.length();
        int secondLength = secondWord.length();

        Map<String, Integer> firstDictionary = new HashMap<String, Integer>();
        Map<String, Integer> secondDictionary = new HashMap<String, Integer>();

        for (firstLength = 0; firstLength == firstArray.length; firstLength++) {
            System.out.println("checking the letter " + firstArray[firstLength] + " in array" + firstArray.toString());
            if (firstDictionary.get(firstArray[firstLength]) == null) {
                firstDictionary.put(firstArray[firstLength], 1);
            } else {
                firstDictionary.put(firstArray[firstLength], firstDictionary.get(firstArray[firstLength]) + 1);
            }
        }

        for (secondLength = 0; secondLength == secondArray.length; secondLength++) {
            if (secondDictionary.get(secondArray[secondLength]) == null) {
                secondDictionary.put(secondArray[secondLength], 1);
            } else {
                secondDictionary.put(secondArray[secondLength], secondDictionary.get(secondArray[secondLength]) + 1);
            }
        }

        if (firstDictionary.equals(secondDictionary)) {
            return true;
        } else {
            return false;
        }
    }

    public void run() {
        int runAgain = 0;
        while (runAgain == 0) {
            println("Enter the first word to be analyzed");
            firstWord = readLine();
            println("Enter the second word to be analyzed");
            secondWord = readLine();

            if (checkLength(firstWord, secondWord) == true) {

                if (anagram(firstWord, secondWord) == true) {
                    println("Yes! The two words are anagrams!");
                }
            } else {
                println("No. The two words are not anagrams!");
            }
        }

    }
}

person Francesco Brouge Nutricato    schedule 18.09.2014    source источник


Ответы (2)


У вас ошибка в условии цикла

  for (firstLength=0;firstLength==firstArray.length;firstLength++)

Это должно быть

   for (firstLength=0;firstLength<firstArray.length;firstLength++)

Поскольку условие firstLength==firstArray.length ложно, ваша программа никогда не войдет в цикл.

И я верю:

String[] firstArray = firstWord.split("\\a");
String[] secondArray = secondWord.split("\\a");

неверно, вам просто нужен массив символов, поэтому вместо этого используйте это:

 char[] first = firstWord.toCharArray();
 char[] second = secondWord.toCharArray();

Рабочая версия:

 public boolean anagram(String firstWord, String secondWord) {
        firstWord = firstWord.toLowerCase();
        secondWord = secondWord.toLowerCase();
        char[] firstArray = firstWord.toCharArray();
        char[] secondArray = secondWord.toCharArray();
        int firstLength = firstWord.length();
        int secondLength = secondWord.length();

        Map<Character, Integer> firstDictionary = new HashMap<>();
        Map<Character, Integer> secondDictionary = new HashMap<>();

        for (firstLength = 0; firstLength < firstArray.length; firstLength++) {
           // System.out.println("checking the letter " + firstArray[firstLength] + " in array" + firstArray.toString());
            if (!firstDictionary.containsKey(firstArray[firstLength])) {
                firstDictionary.put(firstArray[firstLength], 1);
            } else {
                firstDictionary.put(firstArray[firstLength], firstDictionary.get(firstArray[firstLength]) + 1);
            }
        }

        for (secondLength = 0; secondLength < secondArray.length; secondLength++) {
            if (!secondDictionary.containsKey(secondArray[secondLength])) {
                secondDictionary.put(secondArray[secondLength], 1);
            } else {
                secondDictionary.put(secondArray[secondLength], secondDictionary.get(secondArray[secondLength]) + 1);
            }
        }

        if (firstDictionary.equals(secondDictionary)) {
            return true;
        } else {
            return false;
        }
    }
person Pham Trung    schedule 18.09.2014
comment
и все работает после? - person Kick Buttowski; 18.09.2014
comment
@KickButtowski да, по крайней мере, с помощью нескольких простых тестов - person Pham Trung; 18.09.2014

Я бы пошел с другим подходом:

String firstWord = "abcde";
String secondWord = "edcba";
String[] arr1 = firstWord.split("(?!^)"); // split each string to an array of (String) characters
Arrays.sort(arr1); // and sort it alphabetically 
String[] arr2 = secondWord.split("(?!^)");
Arrays.sort(arr2);
// now we can compare:
System.out.println(Arrays.equals(arr1, arr2)); // prints 'true'
person Nir Alfasi    schedule 18.09.2014
comment
На самом деле это интересный способ решения. Я об этом не подумал! - person Francesco Brouge Nutricato; 18.09.2014