【问题标题】:Rewriting nested for loops to give better formatted output重写嵌套的 for 循环以提供更好的格式化输出
【发布时间】:2012-11-17 19:43:14
【问题描述】:

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

Sophia Candappa     F 23 00011  

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

  1. 异性
  2. 年龄相隔五年以内
  3. 他们有三个共同点

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

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

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

  • 如何稍微改变输出。目前,如果一个客户端被匹配,它会显示“[Client Name] is compatible with”,然后它会换行并输出所有匹配的客户端。我想更改它,以便如果客户端只有一个匹配项,它会显示“客户端名称与兼容”...,但如果客户端有两个或更多客户端,它会显示“客户端名称与以下 [两个/三个/四个]客户...

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

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

【问题讨论】:

  • 如果你不想使用任何Java特性,比如集合,就用C++?
  • @Adam:我不知道如何使用 C++,即使我知道,我也必须使用 Java。我只是不能使用 ArrayList(而是一个对象数组)。
  • 将一些代码分离成单独的方法的重点不是性能,而是可读性。如果您将代码分成更小的块,您和其他所有人都会更好地理解您的代码。
  • @AlanStokes:我最初是这样做的,并在方法调用中传递了数组的相关元素(即,如果 compareGender 方法发现客户端性别不同,则将数组和两个元素传递给 compareAge 方法)。但是,我的输出再次无法获得良好的格式。

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


【解决方案1】:

一个小问题编码了这么多刻板印象!

为了提高效率,您的两个循环本身并没有错。但通常最好看大图(算法)而不是细节(循环、数组与 ArrayList)。

所以,一些简单的建议:

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

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

【讨论】:

  • 感谢所有这些。是的,很多刻板印象!我的讲师的指导是: ...编写一个 Java 程序,它将读取这些信息并将其存储在一个数组中。对于约会机构的每个客户,您应该打印出彼此兼容的客户。
  • 因此,尽管您的想法很好,但我认为我必须存储所有客户,无论兴趣如何。按年龄排序的商店客户听起来很有趣,但值得改变吗?由于它们目前是按性别存储的,所以会不会加快年龄比较而减慢性别比较?
  • 对于 20 个客户来说,除了显而易见的 tbh 之外,不值得做任何事情。
  • 您可以分别存储每个性别的客户,每个客户按年龄排序 - 然后您可以快速进行两种比较。但同样对于少量的投入并不是真正的胜利。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 2016-12-10
相关资源
最近更新 更多