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类型。
修改
FTW这是最初的挑战,我意识到我已经离开了解决方案。http://www.home.hs-karlsruhe.de/~pach0003/informatik_1/aufgaben/en/arrays.html
我最初的膝盖反应是简单地通过数组a工作,淘汰那些与数组b匹配的字符 - 但这似乎要求我在每次迭代时重建数组 - 非常感谢你为教育我所做的一切努力。
答案 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);
}
}