首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按字母顺序对字符串进行排序--我是否遗漏了什么显而易见的东西?

按字母顺序对字符串进行排序--我是否遗漏了什么显而易见的东西?
EN

Stack Overflow用户
提问于 2011-11-21 22:58:05
回答 4查看 262关注 0票数 4
代码语言:javascript
复制
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();
    }
}

作为一个初学者,我破解了这个布尔字形检验器。我选择的解决方案是创建一个sortStringAlphabetically方法似乎做了太多的类型-杂耍字符串-> chars[] -> ArrayList ->String -假设我只是想比较两个字符串来测试一个短语是否是另一个短语的字谜-我可以用更少的类型杂耍来完成吗?

ps导师的解决方案离我的尝试只有一英里之遥,而且可能因为很多原因而变得更好--但我真的在努力掌握所有不同的集合类型。

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匹配的字符-但这似乎需要我在每次迭代中重新构建数组-非常感谢您为教育我所做的所有努力。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-21 23:05:16

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

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

注意:我不知道你被允许使用什么库(Google和Apache有这些类型),但你总是可以“自己酿造”。

此外,请确保您的类型使用泛型。仅仅定义ArrayLists是很有风险的,IMHO。

票数 3
EN

Stack Overflow用户

发布于 2011-11-21 23:09:14

你的算法,但更短(但更慢)。“类型转换”是在Java的各种库类中“隐式”完成的:

代码语言:javascript
复制
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正则表达式以排除您不想考虑用于字形变化的那些字母

票数 1
EN

Stack Overflow用户

发布于 2011-11-21 23:14:14

您可以只对字符串进行排序,而不使用列表:

代码语言:javascript
复制
public static String sortStringAlphabetically(String s) {
    String lettersOnly = s.replaceAll("\\W", "");
    char[] chars = lettersOnly.toCharArray();
    Arrays.sort(chars);
    return new String(chars);
}

注:我实际上还没有试过运行代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8213787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档