1

以下は、私が行っている大学の実践的なコードです。20個のクライアントのtxtファイルを読み込み、その情報は次のようにtxtファイルに保存されます。

Sophia Candappa     F 23 00011  

講師の指示に従って、この情報をClientというクラスに格納しました(ただし、ArrayListの方が優れていることはわかっていますが、使用できません)。
以下のコードは、すべてのクライアントを相互に比較し、それらが一致するかどうかを判断するために使用されるメソッドです。次のすべての場合、それらは一致します。

  1. 異性
  2. 互いに5年以内の年齢
  3. 彼らには共通の3つの利益があります

後者は、上記の例の文字列「00011」によって決定されます。クライアントが文字列の同じ場所で番号「1」を3回以上共有する場合、3番目の条件が満たされます。

私のコードは完全に機能し、目的の結果を出力します。しかし、私は2つの質問をしたいと思います。

  • (ArrayListsなしで)可能な限り効率的ですか?私はすべてのif/elseステートメントを別々のメソッドに分離することを検討していましたが、実際のループを減らすことはできないと思ったので、それを拒否しました。

  • 出力を少し変更するにはどうすればよいですか。現在、クライアントが一致した場合、「[クライアント名]は互換性があります」と表示され、新しい行を取り、一致したすべてのクライアントを出力します。クライアントが1つだけ一致する場合は「クライアント名は互換性があります」と表示されるように変更したいのですが、クライアントが2つ以上のクライアントを使用する場合は、「クライアント名は次の[2つと互換性があります」と表示されます。 / three/four]クライアント..。

私は後者を試してみましたが、いつもフォーマットを台無しにしてしまいます。提供できる助けを事前に感謝します。

public static void matchClients(Client[] clientDetails)
{
    boolean anyMatch;
    int count;
    for (int b = 0; b < numberOfClients; b++)
    {
        anyMatch = false;
        count = 0;
        for (int c = 0; c < numberOfClients; c++)
        {
            if (clientDetails[b].getClientGender()!=clientDetails[c].getClientGender())
            {
                if (Math.abs(clientDetails[b].getClientAge() - clientDetails[c].getClientAge()) <= 5)
                {
                    int interests = 0;

                    String clientOneInterests = clientDetails[b].getClientInterests();
                    String clientTwoInterests = clientDetails[c].getClientInterests();

                    int interestNumber = 0;
                    while (interestNumber < clientOneInterests.length())
                    {
                        if ((clientOneInterests.charAt(interestNumber) == clientTwoInterests.charAt(interestNumber))
                                && (clientOneInterests.charAt(interestNumber) == '1' ))
                            interests++;
                        interestNumber++;
                    }

                    if (interests >= 3)
                    {
                        anyMatch = true;
                        if (count == 0)
                        {
                            System.out.println(clientDetails[b].getClientName() + "is compatible with the following client(s)");
                            System.out.println("\t" + clientDetails[c].getClientName());
                        }
                        else
                        {
                            System.out.println("\t" + clientDetails[c].getClientName());
                        }
                        count++;
                    }
                    interests = 0;
                }
            }
        }
        if (anyMatch == false)
            System.out.println(clientDetails[b].getClientName() + "is not compatible with any client.");
        System.out.println("");
    }
}
4

1 に答える 1

0

1つの小さな質問にエンコードされた非常に多くのステレオタイプ!

効率を改善するために、2つのループに本質的に問題はありません。ただし、一般的には、詳細(ループ、配列とArrayList)よりも全体像(アルゴリズム)を確認する方が適切です。

だから、いくつかの簡単な提案:

  • 男性と女性のクライアントを別々に保管します。
  • クライアントを年齢順に保存すると、年齢が一致する可能性のあるクライアントの範囲をすばやく見つけることができます(二分探索と線形探索)。
  • 関心が3つ未満の人をわざわざ保存しないでください。

関心を一致させるには、もう少し努力する必要がありますが、クライアントの数が多い場合にできることがあります(たとえば、関心のセットから、まさにそれらの関心を持つクライアントへのマップがある場合)。

于 2012-11-17T21:02:19.680 に答える