比较两个字符串中的字符时输出错误

时间:2012-11-15 22:44:43

标签: java string debugging character

我坚持使用我正在创建的一段代码。我的IDE是Eclipse,当我使用它的调试功能时,为了跟踪每一行上发生的事情,它输出完美。但是,当我单击“运行”项目时,它只输出一个空白屏幕:

public static void compareInterests(Client[] clientDetails)
{
    int interests = 0;

    for (int p = 0; p < numberOfClients; p++)
    {
        for (int q = 0; q < numberOfClients; q++)
        {
            String a = clientDetails[p].getClientInterests();
            String b = clientDetails[q].getClientInterests();

            int count = 0;
            while (count < a.length())
            {
                if (a.charAt(count) == b.charAt(count))
                    interests++;
                count++;
            }

            if ((interests >= 3) && (clientDetails[p].getClientName() != clientDetails[q].getClientName()))
                System.out.print (clientDetails[p].getClientName() + " is compatible with " + clientDetails[q].getClientName());
            interests = 0;
        }
    }
}

该代码旨在导入一个对象数组,其中包含有关客户端名称和客户端兴趣的信息。客户的兴趣以“01010”格式存储,其中每个1意味着他们对该活动感兴趣,每个0意味着他们不感兴趣。

我的代码将每个客户的字符串的每个字符与每个其他客户的字符串进行比较,并输出所有不具有相同名称且具有三个或更多共同兴趣的客户的结果。

当我通过Java的调试器运行此代码时,它输出正常 - 但是当我单击运行项目或编译时,我只是得到一个空白屏幕。

有什么想法吗?

编辑:我改变了部分

clientDetails[p].getClientName() != clientDetails[q].getClientName()

clientDetails[p].getClientName().equals(clientDetails[q].getClientName()

正如以下答案中的人所说。但是,我仍然得到空白输出。任何其他想法(以及为什么Eclipse的调试器会忽略它并正确输出所有内容?)

示例输入如下所示:

 Sophia Candappa     F 23 00011
 Jade Clarke         F 25 00011

忽略性别和年龄(F和23/25),因为我已在其他部分照顾过它们。

编辑2:

好的,现在更奇怪了!如果我在interest = 0之后添加此代码,就像这样:

    interests = 0;
    System.out.println("");

我得到它的输出(可怕的格式化输出,因为我可能得到一个结果,新行,结果,然后四个新行,然后结果,取决于谁与循环语句中的谁匹配。 我真的不明白为什么那条线给出输出。任何人??

3 个答案:

答案 0 :(得分:0)

使用String.equals代替==运算符来比较String内容:

if ((interests >= 3) && (!clientDetails[p].getClientName().equals(clientDetails[q].getClientName()))

答案 1 :(得分:0)

Java不是javascript ...

与javascript不同,在java中,==运算符测试两个对象是否是完全相同的实例 - 即两个变量是否引用对象。

比较对象的时,请使用.equals()方法 请注意,.equals()(在Object类中)的默认实现实际上与==比较相同,但覆盖它的类(如String)比较它们州(价值)。

这是java新手程序员最常犯的错误之一。

你想要的是:

!clientDetails[p].getClientName().equals(clientDetails[q].getClientName())

或者

!clientDetails[p].getClientName().equalsIgnoreCase(clientDetails[q].getClientName())

答案 2 :(得分:0)

以下是您遗失的javadocs相关摘录:

  

可选地,可以创建PrintStream以便自动刷新;   这意味着在一个字节后自动调用flush方法   写入数组,调用println方法之一,或换行   写入字符或字节('\ n')

您的函数中唯一的输出是System.out.print()调用。因此,没有任何东西强制刷新System.out的缓冲区,并且无法保证您将看到该输出。调试器(可以)对刷新输出缓冲区更加积极,这就是你在调试器中看到输出的原因。上面引用的文本解释了为什么添加空的println()调用修复了你的问题 - println()强制写出缓冲区。