public class Anagram {
    public static void main(String[] args) {

        String a = "Despera tion-".toLowerCase();
        String b = "A Rope Ends It".toLowerCase();

        String aSorted = sortStringAlphabetically(a);
        String bSorted = sortStringAlphabetically(b);

        if(aSorted.equals(bSorted)){
            System.out.println("Anagram Found!");
        }else{
            System.out.println("No anagram was found");
        }

    }

    public static String sortStringAlphabetically(String s) {

        char[] ca = s.toCharArray();
        int cnt = 0;
        ArrayList al = new ArrayList();

        for (int i = 0; i < ca.length; i++) {
            if (Character.isLetter(ca[cnt]))
                al.add(ca[cnt]);

            cnt++;
        }

        Collections.sort(al);
        return al.toString();
    }
}

作为学习者,我修改了这个布尔的Anagram检查器。我选择的解决方案是创建一个sortStringAlphabetically方法似乎对类型杂乱的字符串进行了太多处理-> chars []-> ArrayList-> String-假设我只想比较2个字符串以测试一个词是否是另一个-我可以减少类型变戏法吗?

ps辅导老师的解决方案距离我的尝试只有一英里远,并且由于许多原因可能要好得多-但我确实在尝试处理所有不同的Collection类型。

http://www.home.hs-karlsruhe.de/~pach0003/informatik_1/aufgaben/en/doc/src-html/de/hska/java/exercises/arrays/Anagram.html#line.18

编辑

FTW这是最初的挑战,我意识到我一直在想办法。

http://www.home.hs-karlsruhe.de/~pach0003/informatik_1/aufgaben/en/arrays.html

我最初的下意识反应是简单地通过数组a工作,剔除那些与数组b匹配的字符-但这似乎要求我在每次迭代时都重新构建数组-非常感谢您对我的所有努力。

最佳答案

如果使用此算法,有多种方法可以改善此问题。
首先,您不一定需要创建一个字符数组。您可以使用String.charAt()访问字符串的特定字符。

其次,您不需要列表。如果使用SortedMultiSet或SortedBag,则可以按排序顺序添加内容。如果编写了一个从字符串创建SortedMultiSet的函数,则可以只比较这些集而无需重建字符串。

注意:我不知道您允许使用哪些库(Google和Apache具有这些类型),但是您始终可以“自酿”。

另外,请确保对类型使用泛型。恕我直言,仅定义ArrayLists是非常冒险的。

09-26 20:59
查看更多