下面是我编写的代码,用于将所有字谜彼此相邻放在一个字符串集合中。 输出未按预期排序。实际上,输出与输入相同。 我哪里错了?
package set2;
import java.util.Arrays;
import java.util.Comparator;
public class printAllAnagrams {
public static void main(String[] args) {
String[] s = { "Harsha", "ant", "sha", "tna", "ash" };
sortAnagrams(s);
for (String e : s) {
System.out.println(e);
}
}
private static void sortAnagrams(String[] s) {
Arrays.sort(s, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
s1.toLowerCase();
s2.toLowerCase();
if (s1.length() != s2.length()) {
return -1;
} else {
char[] s1_char = s1.toCharArray();
char[] s2_char = s2.toCharArray();
Arrays.sort(s1_char);
Arrays.sort(s2_char);
for (int i = 0; i < s1_char.length; i++) {
if (s1_char[i] != s2_char[i]) {
return -1;
}
}
}
return 0;
}
});
}
}
答案 0 :(得分:0)
不仔细看,这个
s1.toLowerCase();
不会改变s1
,而是返回 new 字符串,该字符串是s1
的小写变体。在Java中,字符串是不可变的。因此,您需要收集并使用上面返回的值。
答案 1 :(得分:0)
这可能是肯定的:
if (s1.length() != s2.length()) {
return -1;
}
这意味着如果s1.length() != s2.length()
s1 < s2
和 s2 < s1
。
我认为你的意思是:
public int compare(String s1, String s2) {
if (s1.length() == s2.length()) {
char[] s1_char = s1.toLowerCase().toCharArray();
char[] s2_char = s2.toLowerCase().toCharArray();
Arrays.sort(s1_char);
Arrays.sort(s2_char);
for (int i = 0; i < s1_char.length; i++) {
if (s1_char[i] != s2_char[i]) {
return (int)(s1_char[i] - s2_char[i]);
}
}
return 0;
} else {
return s1.length() - s2.length();
}
}
答案 2 :(得分:0)
为什么不执行以下操作:
@Override
public int compare(String s1, String s2) {
return s1.toLowerCase().compareTo(s2.toLowerCase());
}
答案 3 :(得分:0)
你的比较器根本不稳定。
首先,如果长度不同,你return -1
。这意味着根据操作数顺序,您可能会发现“asbd”&gt; “灰”或相反。
您也可以使用char比较。
if (s1_char[i] != s2_char[i]) {
return -1;
}
用以下代替:
if (s1_char[i] != s2_char[i]) {
return s1_char[i] > s2_char[i] ? 1 : -1;
}
使用相同的模式进行长度比较。
编辑从compare
方法返回-1意味着根据documentation找到小于第二个的第一个操作数。
答案 4 :(得分:0)
字符串是不可变的,因此仅在String
对象上调用方法不会更改String
本身。您应该使用以下内容:
s1 = s1.toLowerCase();
s2 = s2.toLowerCase();
答案 5 :(得分:0)
来自javadoc:
实施者必须确保所有
sgn(compare(x,y)) == -sgn(compare(y,x))
和x
都y
。 (这意味着compare(x,y)
当且仅当compare(y,x)
抛出异常时才必须抛出异常。)。
这基本上意味着,如果您致电compare(s1,s2)
,则必须产生-1 * compare(s2,s1)
,并且您的return -1;
语句都不会跟随此情况。而不是那样,你可以将int和字符相互比较并返回该值,例如这段代码可以工作(而不是return -1;
):
return Integer.compare(s1.length(),s2.length()); //for the ints
return Character.compare(s1_char[i],s2_char[i]); //for the chars
另请查看Vishal的答案,这是另一个错误。