0

我被我正在创建的一段代码所困扰。我的 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:

好吧,现在更陌生了!如果我在兴趣 = 0 之后添加此代码,如下所示:

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

我从中得到输出(可怕的格式化输出,因为我可能会得到一个结果,新行,结果,然后是四个新行,然后是结果,这取决于谁与循环语句中的谁匹配。我真的不明白为什么行给出输出。有人吗??

4

3 回答 3

0

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

if ((interests >= 3) && (!clientDetails[p].getClientName().equals(clientDetails[q].getClientName()))
于 2012-11-15T22:49:34.557 回答
0

Java不是javascript...

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

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

这是 Java 新手最常犯的错误之一。

你想要的是:

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

也许

!clientDetails[p].getClientName().equalsIgnoreCase(clientDetails[q].getClientName())
于 2012-11-15T23:02:06.410 回答
0

这是您缺少的javadocs中的相关片段:

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

您的函数中唯一的输出是 System.out.print() 调用。因此,没有什么会强制刷新 System.out 的缓冲区,并且不能保证您会看到该输出。调试器(可以)更积极地刷新输出缓冲区,这就是您从调试器中看到输出的原因。上面引用的文本解释了为什么添加空的 println() 调用可以解决您的问题 - println() 会强制写出缓冲区。

于 2012-11-16T00:03:42.480 回答