Java 如何比较基元类型中的字符大小写
我正在编写以下代码行:Java 如何比较基元类型中的字符大小写,java,string,character,case-sensitive,case-insensitive,Java,String,Character,Case Sensitive,Case Insensitive,我正在编写以下代码行: String name1 = fname.getText().toString(); String name2 = sname.getText().toString(); aru = 0; count1 = name1.length(); count2 = name2.length(); for (i = 0; i < count1; i++) { for (j = 0; j < count2; j++) { if (n
String name1 = fname.getText().toString();
String name2 = sname.getText().toString();
aru = 0;
count1 = name1.length();
count2 = name2.length();
for (i = 0; i < count1; i++)
{
for (j = 0; j < count2; j++)
{
if (name1.charAt(i)==name2.charAt(j))
aru++;
}
if(aru!=0)
aru++;
}
String name1=fname.getText().toString();
字符串名称2=sname.getText().toString();
aru=0;
count1=name1.length();
count2=name2.length();
对于(i=0;i
我想比较两个
字符串的字符
s,忽略大小写。简单地使用IgnoreCase
是行不通的。添加“65”ASCII
值也不起作用。如何执行此操作?您可以在使用字符串之前更改其大小写,如下所示
String name1 = fname.getText().toString().toLowerCase();
String name2 = sname.getText().toString().toLowerCase();
然后继续执行rest操作。Java API类具有各种可以使用的函数
您可以在两侧将字符转换为小写:
Character.toLowerCase(name1.charAt(i)) == Character.toLowerCase(name2.charAt(j))
还有一种方法可用于验证字母是大写还是小写:
Character.isUpperCase('P')
Character.isLowerCase('P')
当比较字符/下层/上限时,你必须考虑土耳其语I问题:
我建议转换为字符串,并使用带有不变区域性的toLowerCase(至少在大多数情况下)
公共最终静态区域设置InvariantLocale=新区域设置(空、空、空);
str.toLowerCase(不变量区域设置)
见类似的C#
注意:不要使用String.equalsIgnoreCase
无论是在字符串上还是在字符中,使用小写字母都不可能真正做到这一点。问题在于,大写或小写都有不同的图示符,根据您是大写还是小写,您的图示符可能会被保留,也可能不会被保留。当你说一个小写字形的两个变体在忽略大小写的情况下进行比较时,你甚至不清楚你的意思是什么:它们是相同的还是不同的?(请注意,也有混合大小写标志符号:\u01c5\u01c8\u01cb\u01f2
或Dž、Lj、Nj、Dz,但此处建议的任何方法都适用于这些标志符号,只要它们与完全大写或完全小写的变体计数相同。)
使用Char
还有一个问题:大约有80个代码点不能用单个Char
表示,它们是大写/小写变体(每个变体40个),至少Java的代码点大写/小写可以检测到这一点。因此,您需要获取代码点并更改这些代码的大小写
但代码点对变体图示符没有帮助
无论如何,这里有一个因变体而有问题的glyph的完整列表,显示了它们与6种变体方法的对比情况:
字符toLowerCase
字符toUpperCase
字符串toLowerCase
字符串toUpperCase
字符串equalsIgnoreCase
字符toLowerCase(toUpperCase)
(反之亦然)
对于这些方法,S
表示变量被视为彼此相同,D
表示变量被视为彼此不同
Behavior Unicode Glyphs
=========== ================================== =========
1 2 3 4 5 6 Upper Lower Var Up Var Lo Vr Lo2 U L u l l2
- - - - - - ------ ------ ------ ------ ------ - - - - -
D D D D S S \u0049 \u0069 \u0130 \u0131 I i İ ı
S D S D S S \u004b \u006b \u212a K k K
D S D S S S \u0053 \u0073 \u017f S s ſ
D S D S S S \u039c \u03bc \u00b5 Μ μ µ
S D S D S S \u00c5 \u00e5 \u212b Å å Å
D S D S S S \u0399 \u03b9 \u0345 \u1fbe Ι ι ͅ ι
D S D S S S \u0392 \u03b2 \u03d0 Β β ϐ
D S D S S S \u0395 \u03b5 \u03f5 Ε ε ϵ
D D D D S S \u0398 \u03b8 \u03f4 \u03d1 Θ θ ϴ ϑ
D S D S S S \u039a \u03ba \u03f0 Κ κ ϰ
D S D S S S \u03a0 \u03c0 \u03d6 Π π ϖ
D S D S S S \u03a1 \u03c1 \u03f1 Ρ ρ ϱ
D S D S S S \u03a3 \u03c3 \u03c2 Σ σ ς
D S D S S S \u03a6 \u03c6 \u03d5 Φ φ ϕ
S D S D S S \u03a9 \u03c9 \u2126 Ω ω Ω
D S D S S S \u1e60 \u1e61 \u1e9b Ṡ ṡ ẛ
更为复杂的是,除非你知道自己是土耳其语的,否则无法获得正确的土耳其语I(即,虚线版本不同于非虚线版本);这些方法都不能给出正确的行为,除非您知道语言环境(即非土耳其语:i
和i
是相同的忽略案例;土耳其语,不是)
总的来说,使用toUpperCase
可以得到最接近的近似值,因为您只有五个大写变体(或者四个,不包括土耳其语)
您还可以尝试专门拦截这五个麻烦案例,并单独对它们调用toUpperCase(toLowerCase(c))
。如果您仔细选择防护装置(只需toUpperCase
Ifc<0x130 | c>0x212B
,然后使用其他替代方案),则对于低范围内的字符,您只能获得约20%的速度惩罚(相比之下,如果您将单个字符转换为字符串并equalsIgnoreCase
将其转换为4倍)如果你有很多人在危险区,那么只有2倍的罚款。您仍然存在虚线I
的区域设置问题,但除此之外,您的状态还不错。当然,如果您可以在较大的字符串上使用equalsIgnoreCase
,您最好这样做
下面是执行此任务的Scala代码示例:
def elevateCase(c: Char): Char = {
if (c < 0x130 || c > 0x212B) Character.toUpperCase(c)
else if (c == 0x130 || c == 0x3F4 || c == 0x2126 || c >= 0x212A)
Character.toUpperCase(Character.toLowerCase(c))
else Character.toUpperCase(c)
}
def-elevateCase(c:Char):Char={
if(c<0x130 | | c>0x212B)字符.toUpperCase(c)
else if(c==0x130 | | c==0x3F4 | | c==0x2126 | | c>=0x212A)
Character.toUpperCase(Character.toLowerCase(c))
else字符。toUpperCase(c)
}
比较两个带忽略大小写的字符串之间某个位置的字符的通用方法
public static boolean isEqualIngoreCase(char one, char two){
return Character.toLowerCase(one)==Character .toLowerCase(two);
}
public static boolean isEqualStringCharIgnoreCase(String one, String two, int position){
char oneChar = one.charAt(position);
char twoChar = two.charAt(position);
return isEqualIngoreCase(oneChar, twoChar);
}
函数调用
boolean isFirstCharEqual = isEqualStringCharIgnoreCase("abc", "ABC", 0)
JDK就是这样做的(改编自OpenJDK 8,):
我想这也适用于土耳其语。你可以使用字符。toLowerCase
或字符。toUpperCase
将所有字符转换为小写或大写,并进行比较。@idottiger在英语中有效,但不是在所有语言中都有效。当心。如果我们正在处理一个“巨大”的字符串序列,字符串替换不会很慢吗“大”字符串?这在每种语言中都不起作用,例如,对于土耳其语,这将失败language@PeterBruins-您能分享一份会导致代码失败的土耳其文本样本吗?土耳其语“İ”(大写字母I,带点)是“i”的大写版本。有关详细信息:char
类型已经过时,应该避免使用,因为它甚至无法表示Unicode中定义的一半字符。这实际上是个问题吗?Java可以将代码点表示为两个字符的组合。还应该使用什么?请参阅codePoint
methods,例如and。这些方法使用int
而不是char
。并读取。
static boolean charactersEqualIgnoringCase(char c1, char c2) {
if (c1 == c2) return true;
// If characters don't match but case may be ignored,
// try converting both characters to uppercase.
char u1 = Character.toUpperCase(c1);
char u2 = Character.toUpperCase(c2);
if (u1 == u2) return true;
// Unfortunately, conversion to uppercase does not work properly
// for the Georgian alphabet, which has strange rules about case
// conversion. So we need to make one last check before
// exiting.
return Character.toLowerCase(u1) == Character.toLowerCase(u2);
}