按字母顺序排序字符串 - 我是否遗漏了一些明显的东西?

时间:2011-11-21 14:58:05

标签: java arrays string

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方法似乎只是做太多类型 - 玩杂耍的字符串 - &gt; chars [] - &gt; ArrayList - &gt; 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匹配的字符 - 但这似乎要求我在每次迭代时重建数组 - 非常感谢你为教育我所做的一切努力。

4 个答案:

答案 0 :(得分:3)

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

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

注意:我不知道您允许使用哪些库(Google和Apache都有这些类型),但您可以随时“酿造自己的”。

此外,请确保为您的类型使用泛型。只是定义ArrayLists是非常危险的,恕我直言。

答案 1 :(得分:1)

您的算法,但更短(但更慢)。 “类型杂耍”在Java的各种库类中“隐式”完成:

public static boolean isAnagram(String a, String b) {
    List<String> listA = new ArrayList<String>(Arrays.asList(
      a.toLowerCase().replaceAll("\\W", "").split("")));
    List<String> listB = new ArrayList<String>(Arrays.asList(
      b.toLowerCase().replaceAll("\\W", "").split("")));

    Collections.sort(listA);
    Collections.sort(listB);

    return listA.equals(listB);
}

(可选)替换\W正则表达式,以排除那些您不想考虑用于字谜的字母

答案 2 :(得分:1)

您可以在不使用列表的情况下对字符串进行排序:

public static String sortStringAlphabetically(String s) {
    String lettersOnly = s.replaceAll("\\W", "");
    char[] chars = lettersOnly.toCharArray();
    Arrays.sort(chars);
    return new String(chars);
}

N.B。我还没有尝试过运行代码。

答案 3 :(得分:1)

public class Anagram {
    public static void main(String[] args) throws Exception {
        String s1 = "Despera tion-";
        String s2 = "A Rope Ends It";
        anagramCheck(s1, s2);
    }

    private static void anagramCheck(String s1, String s2) {
        if (isAnagram(s1, s2)) {
            System.out.println("Anagram Found!");
        } else {
            System.out.println("No anagram was found");
        }
    }

    private static boolean isAnagram(String s1, String s2) {
        return sort(s1).equals(sort(s2));
    }

    private static String sort(String s) {
        char[] array = s.replaceAll("\\W", "").toLowerCase().toCharArray();
        Arrays.sort(array);
        return new String(array);
    }
}