首先,您的问题是使用区分大小写的方法`compareTo()。这意味着大写字母与小写字母分开排列。原因是它翻译成Unicode,其中大写字母的数字小于小写字母的数字。因此,您应该使用“ compareToIgnoreCase()”,就像以前的文章中提到的一样。
这是我如何有效执行操作的完整示例方法
创建比较器的对象后,您可以在java.util.Arrays中定义的此sort()版本中传递它。
static<T>void sort(T[]array,Comparator<?super T>comp)
仔细看看超级。这样可以确保传入的数组与比较器的类型兼容。
这种方式的神奇之处在于,您可以轻松地以相反的顺序对字符串数组进行排序,方法很简单:
return strB.compareToIgnoreCase(strA);
import java.util.Comparator;
public class IgnoreCaseComp implements Comparator<String> {
@Override
public int compare(String strA, String strB) {
return strA.compareToIgnoreCase(strB);
}
}
import java.util.Arrays;
public class IgnoreCaseSort {
public static void main(String[] args) {
String strs[] = {" Hello ", " This ", "is ", "Sorting ", "Example"};
System.out.print("Initial order: ");
for (String s : strs) {
System.out.print(s + " ");
}
System.out.println("\n");
IgnoreCaseComp icc = new IgnoreCaseComp();
Arrays.sort(strs, icc);
System.out.print("Case-insesitive sorted order: ");
for (String s : strs) {
System.out.print(s + " ");
}
System.out.println("\n");
Arrays.sort(strs);
System.out.print("Default, case-sensitive sorted order: ");
for (String s : strs) {
System.out.print(s + " ");
}
System.out.println("\n");
}
}
run:
Initial order: Hello This is Sorting Example
Case-insesitive sorted order: Hello This Example is Sorting
Default, case-sensitive sorted order: Hello This Example Sorting is
BUILD SUCCESSFUL (total time: 0 seconds)
替代选择
compareToIgnoreCase()
尽管该方法在许多场合都可以很好地工作(就像在英语中比较字符串一样),但在所有语言和位置都无法很好地工作。这自动使其成为不合适的选择。为了确保在所有地方都支持它,您应该compare()
在java.text.Collator中使用。
您可以通过调用方法找到适合您所在位置的整理器getInstance()
。之后,您应该设置此整理器的强度属性。可以使用setStrength()
方法和Collator.PRIMARY
as参数来完成此操作。通过这种选择,可以像下面这样编写IgnocaseComp。此版本的代码将独立于位置生成相同的输出
import java.text.Collator;
import java.util.Comparator;
public class IgnoreCaseComp implements Comparator<String> {
Collator col;
IgnoreCaseComp() {
col = Collator.getInstance();
col.setStrength(Collator.PRIMARY);
}
@Override
public int compare(String strA, String strB) {
return col.compare(strA, strB);
}
}