重写嵌套for循环以提供更好的格式化输出

时间:2012-11-17 19:43:15

标签: java arrays if-statement for-loop nested-loops

以下是我正在做的大学实践的代码。它读入一个包含20个客户端的txt文件,其信​​息存储在txt文件中,如下所示:

Sophia Candappa     F 23 00011  

根据我的讲师的指示,我已将此信息存储在一个名为Client的类中(虽然我知道ArrayList会更好,但我不能使用它。)
下面的代码是一种方法,用于将所有客户端相互比较并确定它们是否匹配。如果他们满足以下所有条件,则匹配:

  1. 对立性
  2. 彼此五年内的年龄
  3. 他们有三个共同的利益
  4. 后者由上例中的字符串“00011”确定。如果客户端在三次或多次情况下在字符串中的同一位置共享数字“1”,则满足第三个条件。

    我的代码完美运行并输出所需的结果。但是,我想问两个问题。

    • 它是否尽可能高效(没有ArrayLists)?我曾考虑将所有if / else语句分离成单独的方法,但是我认为它不会减少任何实际的循环。

    • 如何稍微更改输出。目前,如果客户端匹配,则显示“[客户端名称]与之兼容”,然后它将采用新行并输出所有匹配的客户端。我想更改它,以便如果客户端只有一个匹配,它会显示“客户端名称与...兼容”,但如果客户端有两个或更多客户端,则表示“客户端名称与以下内容兼容[两个/三/四]客户...

    我尝试过后者,但我总是弄乱格式化。提前感谢您提供的任何帮助。

    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("");
        }
    }
    

1 个答案:

答案 0 :(得分:0)

如此多的刻板印象在一个小问题中编码!

为了提高效率,你的两个循环没有任何内在错误。但是通常最好看一下大图(算法)而不是细节(循环,数组和ArrayList)。

所以,一些简单的建议:

  • 分别存放男性和女性客户。
  • 按年龄顺序存储客户,这样您就可以快速找到可能年龄匹配的客户端范围(二分搜索与线性搜索)。
  • 不要打扰存储利息少于3的人。

对于匹配的兴趣,你必须更加努力地工作,但是如果客户的数量很大,你可以做些事情(例如,从感兴趣的集合到具有这些兴趣的客户的地图)。