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 は関心がないことを意味します。

私のコードは、すべてのクライアントの文字列の各文字を他のすべてのクライアントの文字列と比較し、同じ名前ではなく、3 つ以上の共通の関心を持つすべてのクライアントの結果を出力します。

このコードを 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つの改行、結果を取得する可能性があるため、ひどくフォーマットされた出力が得られます。その理由が本当にわかりません行は出力を提供します。

4

3 に答える 3

0

Javaはjavascriptではありません...

javascript とは異なり、java では、==演算子は 2 つのオブジェクトがまったく同じインスタンスであるかどうか、つまり 2 つの変数がオブジェクトを参照しているかどうかをテストします。

オブジェクトのを比較する場合は、.equals()メソッドを使用します。(クラス内の)
のデフォルトの実装は実際には比較と同じですが、( のように) それをオーバーライドするクラスはそれらの状態 (値) を比較することに注意してください。.equals()Object==String

これは、Java を初めて使用するプログラマーが犯す最も一般的な間違いの 1 つです。

あなたが望むのは:

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

多分

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

コンテンツを比較するためString.equalsに演算子の代わりに使用します。==String

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

欠落しているjavadocsからの関連するスニペットは次のとおりです。

オプションで、自動的にフラッシュするように PrintStream を作成できます。これは、バイト配列が書き込まれた後、println メソッドの 1 つが呼び出された後、または改行文字またはバイト ('\n') が書き込まれた後に、flush メソッドが自動的に呼び出されることを意味します。

関数の唯一の出力は System.out.print() 呼び出しです。したがって、System.out のバッファーのフラッシュを強制するものはなく、その出力が表示されるという保証はありません。デバッガーは、出力バッファーのフラッシュについてもう少し積極的である可能性があります。これが、デバッガー内からの出力が表示される理由です。そして、上記の引用文は、空の println() 呼び出しを追加すると問題が解決した理由を説明しています-println() は、バッファーを強制的に書き出させます。

于 2012-11-16T00:03:42.480 に答える