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是非常冒险的。