首先,您的问题是您使用了区分大小写的方法`compareTo()。这意味着大写字母与小写字母分开排序。原因是它翻译成 Unicode,其中大写字母的数字小于小写字母的数字。因此,您应该使用 `compareToIgnoreCase()`,就像之前的帖子中提到的那样。
这是我如何有效地做到这一点的完整示例方法
创建Comparator的对象后,您可以在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()
虽然适用于很多场合(就像比较英语中的字符串),但它不适用于所有语言和位置。这自动使其成为不适合使用的选择。为确保在您应该使用 java.text.Collator 的任何地方都compare()
支持它。
您可以通过调用方法找到您所在位置的整理器getInstance()
。之后,您应该设置此 Collator 的强度属性。这可以通过setStrength()
方法和Collator.PRIMARY
作为参数来完成。有了这个替代选择,IgnocaseComp可以像下面那样编写。此版本的代码将独立于位置生成相同的输出
import java.text.Collator;
import java.util.Comparator;
//this comparator uses one Collator to determine
//the right sort usage with no sensitive type
//of the 2 given strings
public class IgnoreCaseComp implements Comparator<String> {
Collator col;
IgnoreCaseComp() {
//default locale
col = Collator.getInstance();
//this will consider only PRIMARY difference ("a" vs "b")
col.setStrength(Collator.PRIMARY);
}
@Override
public int compare(String strA, String strB) {
return col.compare(strA, strB);
}
}