我在Java中使用字符串比较有一点/巨大的问题,我想比较两个字符串,.equals([...])
没有给我正确的结果。
我还尝试了以下操作:==
,.compareTo([...])
,.trim()
,.equalsIgnoreCase([...])
,使用默认语言环境创建了一个Collator并使用[collator].compare
。
(一切都行不通)
第一个String来自已创建的对象(字符串的内容来自数据库),第二个String来自新创建的对象(但已传递给方法),此String的内容来自相同的数据库。
我现在很无能为力,我尝试的最后一件事就是把它转换成某个数字(即十六进制)。
我已经尝试将两个字符串写入控制台并手动查找差异,但没有...
代码就是这样:
public static Lagerplatz hinzufuegen(Lagerplatz lagerplatz) {
boolean neu = true;
if (lagerplaetze.isEmpty()) {
lagerplaetze.add(lagerplatz);
System.out.println(lagerplatz.getBezeichnung() + " erstmalig hinzugefügt!");
}
for (int i = 0; i < lagerplaetze.size(); i++) {
System.out.println("'" + lagerplatz.getBezeichnung() + "'" + " - " + "'"
+ lagerplaetze.get(i).getBezeichnung() + "'");
if (lagerplatz.getBezeichnung().equalsIgnoreCase(lagerplaetze.get(i).getBezeichnung())) {
neu = false;
}
}
if (neu) {
lagerplaetze.add(lagerplatz);
System.out.println(lagerplatz.getBezeichnung() + " hinzugefügt!");
}
return lagerplatz;
}
if-part with(lagerplaetze.isEmpty())确实有效,在添加第一个之后它应该检查Lagerplatz(至少其名称)是否已经在lagerplaetze-ArrayList中,如果是的话那么如果没有添加,请添加。
单步调试显示对象被正确引用...
非常感谢,如果这个问题已经得到回答,我很抱歉,但在所有这些问题上找不到帮助答案......
EDIT1 :正常化在这种情况下无效,“umlaute”(德语ä,ö或ü)不会导致问题......
将String转换为byte []并将此byte-array转换为String,如:
(Arrays.toString(lagerplatz.getBezeichnung().getBytes()).equalsIgnoreCase(
Arrays.toString(lagerplaetze.get(i).getBezeichnung().getBytes())))
然后比较它也没有解决问题,两个字符串的字节完全相同:'[72, 55, 48]' - '[72, 55, 48]'
EDIT2 :问题不在于字符串比较,这是因为“Lagerplatz”类的变量是静态的,每次输入循环时都会替换它们... 也许删除这个问题?
答案 0 :(得分:4)
唯一一次看起来完全相同但equals()
不会导致true
的字符串是unicode组合不同的时候。
例如,可以用单个字符组成A变音符号(Ä):\u00C4
或者使用A
字符和点(dieresis字符¨
)的组合:\u0041\u0308
实际上,您使用两个 unicode字符来表示一个字母。因为equals()
比较字符,所以带有dieresis的表单不等于没有。
要解决此问题,必须在比较之前将每个字符串分解为规范形式。
在Java中,可以创建这样的规范形式:
java.text.Normalizer.normalize("Your String", java.text.Normalizer.Form.NFD);
归一化后,equals()
将按预期工作。
显然,由于您未提供任何数据,因此该答案可能与您的问题相符,也可能不符合您的问题。
在任何情况下,您可能希望以某种形式规范化所有字符串,然后使用Set
作为数据结构,而不是列表。