Class 的compareToIgnoreCase方法String是使用下面的代码段(jdk1.8.0_45)中的方法实现的.
一世.为什么都Character.toUpperCase(char)和Character.toLowerCase(char)用于比较?它们中的任何一个都不足以达到比较的目的吗?
II.为什么s1.toLowerCase().compare(s2.toLowerCase())不习惯实施compareToIgnoreCase? - 我理解可以用不同的方式实现相同的逻辑.但是,我仍然想知道是否有特定的理由选择一个而不是另一个.
public int compare(String s1, String s2) {
int n1 = s1.length();
int n2 = s2.length();
int min = Math.min(n1, n2);
for (int i = 0; i < min; i++) {
char c1 = s1.charAt(i);
char c2 = s2.charAt(i);
if (c1 != c2) {
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
if (c1 != c2) {
c1 = Character.toLowerCase(c1);
c2 = Character.toLowerCase(c2);
if (c1 != c2) {
// No overflow because of numeric promotion
return c1 - c2;
}
}
}
}
return n1 - n2;
}
Run Code Online (Sandbox Code Playgroud)
有些语言具有特殊字符,可以转换为上部或下部字符(或字符序列).
因此,仅使用一个案例可能会对这种特殊字符产生一些问题.
例如,德语中的Eszettß字符以大写字母转换为SS.来自维基百科:
eszett这个名字来自两个字母S和Z,因为它们用德语发音.它的Unicode编码是U + 00DF.
因此,如果只使用较低的比较,像groß这样的词与粗略相比会产生失败.
@chrylis这是一个有效的例子
System.out.println("ß".toUpperCase().equals("SS")); // True
System.out.println("ß".toLowerCase().equals("ss")); // false
Run Code Online (Sandbox Code Playgroud)
感谢@chrylis的评论我做了一些额外的测试,我在String类上发现了一个可能的错误:
System.out.println("ß".toUpperCase().equals("SS")); // True
System.out.println("ß".toLowerCase().equals("ss")); // false
but
System.out.println("ß".equalsIgnoreCase("SS")); // False
System.out.println("ß".equalsIgnoreCase("ss")); // False
Run Code Online (Sandbox Code Playgroud)
因此,如果手动转换为大写,则至少存在两个字符串相等的情况,但如果比较忽略大小写则不等于.
这是使用土耳其语的例子:
System.out.println(Character.toUpperCase('i') == Character.toUpperCase('?'));
System.out.println(Character.toLowerCase('i') == Character.toLowerCase('?'));
Run Code Online (Sandbox Code Playgroud)
第一行打印false; 第二个true.Ideone demo.
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |