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匹配的字符-但这似乎需要我在每次迭代中重新构建数组-非常感谢您为教育我所做的所有努力。
发布于 2011-11-21 23:05:16
如果你使用这个算法,有不同的方法可以改善这一点。首先,您不一定需要创建字符数组。您可以使用String.charAt()来访问字符串中的特定字符。
其次,你不需要列表。如果您使用SortedMultiSet或SortedBag,则只需按排序的顺序添加内容即可。如果您编写了一个从字符串创建SortedMultiSet的函数,那么您可以只比较集合,而无需重新构建字符串。
注意:我不知道你被允许使用什么库(Google和Apache有这些类型),但你总是可以“自己酿造”。
此外,请确保您的类型使用泛型。仅仅定义ArrayLists是很有风险的,IMHO。
发布于 2011-11-21 23:09:14
你的算法,但更短(但更慢)。“类型转换”是在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正则表达式以排除您不想考虑用于字形变化的那些字母
发布于 2011-11-21 23:14:14
您可以只对字符串进行排序,而不使用列表:
public static String sortStringAlphabetically(String s) {
String lettersOnly = s.replaceAll("\\W", "");
char[] chars = lettersOnly.toCharArray();
Arrays.sort(chars);
return new String(chars);
}注:我实际上还没有试过运行代码。
https://stackoverflow.com/questions/8213787
复制相似问题