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

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

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

Sophia Candappa     F 23 00011  

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

  1. 异性
  2. 年龄相差五岁以内
  3. 他们有三个共同兴趣

后者由上例中的字符串“00011”确定。如果客户端在字符串中的同一位置共享数字“1”三次或多次,则满足第三个条件。

我的代码运行良好并输出所需的结果。不过我想问两个问题。

  • 它是否尽可能高效(没有 ArrayList)?我曾考虑过将所有 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("");
    }
}

最佳答案

一个小问题中包含了如此多的刻板印象!

为了提高效率,您的两个循环本身没有任何问题。但通常最好关注全局(算法)而不是细节(循环、数组与 ArrayList)。

所以,一些简单的建议:

  • 将男性和女性客户分开存放。
  • 按年龄顺序存储客户,以便您可以快速找到可能年龄匹配的客户范围(二分搜索与线性搜索)。
  • 不必费心存储兴趣少于 3 个的人。

为了匹配兴趣,您必须更加努力,但如果客户数量很大,您可以做一些事情(例如,从兴趣集到具有这些兴趣的客户的 map )。

关于java - 重写嵌套 for 循环以提供更好的格式化输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13434140/

相关文章:

java二叉搜索树找到最近的叶子

java - 如何 Autowiring Spring类的bean

java - 如何在未安装 MySQL 的计算机上运行使用 MySQL DB 的 Java 应用程序?

c++: new 表达式中的数组大小必须是常量

javascript - 调用与局部变量同名的函数

javascript - 当未列出下拉选项时,用户可以手动输入自定义值

java打印字符串给出指针编号

Ruby 枚举方法示例

java - Java中一个数组中元素之间的差异

java - 使用 Java lambda 而不是 'if else'