字符串比较是错误的

时间:2014-12-27 18:29:37

标签: java string equals

我在Java中使用字符串比较有一点/巨大的问题,我想比较两个字符串,.equals([...])没有给我正确的结果。

我还尝试了以下操作:==.compareTo([...]).trim().equalsIgnoreCase([...]),使用默认语言环境创建了一个Collat​​or并使用[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”类的变量是静态的,每次输入循环时都会替换它们... 也许删除这个问题?

1 个答案:

答案 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作为数据结构,而不是列表。