从同一个方法返回两个数组?

时间:2011-12-10 01:50:06

标签: java arrays methods return

我正在尝试制作一个能够在城市A和城市B中读取高温5天的程序。我必须为城市制定一个方法,将采用所有10个值并将它们返回到主要方法。我最初有一种方法可以将[0] - [4]视为cityA,将[5] - [9]视为cityB,但我的教授说这不是他想要的(即使答案在技术上是正确的)。

很难读出他的笔迹,但这似乎就是他要说的。

编辑 - 我根据建议把它变成了一个可变长度的参数。仍然致力于使返回声明正确,但除此之外它看起来我认为它应该如何。

编辑#2 - 我刚刚意识到字符串城市在主要方法中被命名为city。修正了,但现在我又收到了另一个错误。返回值缺失?我正在做这本书现在所说的内容 - 书中的例子......

printMax(new double[] {1, 2, 3});
if (numbers.length == 0) {
System.out.println("No argument passed");
return;

__ _ __ _ __ 最新代码

public static double[] getHighTemperatures(String cityName, int numberOfDays) {
    Scanner keyboard = new Scanner(System.in);
    double[] highsForNewYork = getHighTemperatures("New York", 5);
    for (int i = 0; i < numberOfDays; i++)
    highsForNewYork[i] = keyboard.nextDouble();
    return(highsForNewYork);
}

__ _ __ _ __ 新代码

package program10a;

import java.util.Scanner;

public class compareCities {

    public static void main(String[] args) {
        double[] temp = new double[5];
        String[] cities = new String[]{"Miami", "Dallas";
        getCityTemp(temp, cities);
    }

    public static double[] getCityTemp(double[] temp, String... cities) {
        Scanner keyboard = new Scanner(System.in);
        if (cities.length == 0) {
            System.out.println("No argument passed.");
            return;
        }
        String cityA = cities[0];

        for (int i = 0; i < temp.length; i++) {
            System.out.print("Enter 5 temperatures for City A. ");
            temp[i] = keyboard.nextDouble();
            if (i < cities.length) {
                cityA = cities[i];
            }
        }

        String cityB = cities[0];

        for (int i = 0; i < temp.length; i++) {
            System.out.print("Enter 5 temperatures for City B. ");
            temp[i] = keyboard.nextDouble();
            if (i < cities.length) {
                cityB = cities[i];
            }
        }
    }
}
下面的

__ _ __ _ __ 是旧代码

public static double[] getCityHighA(double[] cityA) {
    Scanner keyboard = new Scanner(System.in);
    for (int i = 0; i < cityA.length; i++) {
        System.out.print("Enter 5 temperatures for City A. ");
        cityA[0] = keyboard.nextDouble();
        cityA[1] = keyboard.nextDouble();
        cityA[2] = keyboard.nextDouble();
        cityA[3] = keyboard.nextDouble();
        cityA[4] = keyboard.nextDouble();
        break;
    }
    return cityA;
}

public static double[] getCityHighB(double[] cityB) {
    Scanner keyboard = new Scanner(System.in);
    for (int i = 0; i < cityB.length; i++) {
        System.out.print("Enter 5 temperatures for City B. ");
        cityB[0] = keyboard.nextDouble();
        cityB[1] = keyboard.nextDouble();
        cityB[2] = keyboard.nextDouble();
        cityB[3] = keyboard.nextDouble();
        cityB[4] = keyboard.nextDouble();
        break;
    }
    return cityB;
}

这是最明智的选择,还是可以使用相同的方法将cityA和cityB传递回main方法?请注意我还没有使用对象(我已经看过使用Object的类似主题,我不明白该怎么做)。谢谢!

5 个答案:

答案 0 :(得分:3)

不要试图从一个方法返回2个数组,而是考虑如何两次使用相同的方法。

也许让它参数化,la

public double[] getHighTemperatures(String cityName, int numberOfDays)

因此,不是为城市A硬编码方法而是为城市B硬编码,而不是硬编码以填充5元素数组,您可以传递任意数量的城市,任意天数。您只需每次捕获结果。

double[] highsForNewYork = ...
double[] highsForLosAngeles = ...

答案 1 :(得分:3)

你可以制作一个二维数组:

public static double[][] getCityHighs(...) {
    double[] cityA = new double[5];
    //....
    double[] cityB = new double[5];
    //....
    return new double[][]{cityA, cityB};
}

double [0]将等于cityA,double [1]将等于cityB。因此,如果您想获得cityA的第一个值,那么您将执行array [0] [0];

或者您可以创建一个存储两个城市的课程:

class cities {
    double[] cityA;
    double[] cityB;
}

答案 2 :(得分:2)

您的for循环非常循环。 :)

i变量是有原因的。而不是你现在正在做什么,这样做:

for (int i = 0; i < cityB.length; ++i) {
    System.out.printf("Enter temperature #%d for City B: ", (i + 1));  // I _think_ there's printf() in Java and it works like C's...
    cityB[i] = keyboard.nextDouble();  // note the use of `i`
}

答案 3 :(得分:2)

您应该使用二维数组,其中第一个维度为city,第二个维度为temperature。像这样:

public static double[][] getHighs() {
  Scanner keyboard = new Scanner(System.in);
  double[][] temps = new double[2][5];

  for(int i = 0; i < temps.length; i++) {
    for(int j = 0; j < temps[i].length; i++) {
      System.out.println("Enter city "+i+"'s temperature #"+j);
      temps[i][j] = keyboard.nextDouble();
    }
  }

  return temps;
}

否则,您可以将方法参数化为@AnthonyPegram说。

答案 4 :(得分:2)

首先,这非常难看:

for (int i = 0; i < cityA.length; i++) {
   System.out.print("Enter 5 temperatures for City A. ");
   cityA[0] = keyboard.nextDouble();
   cityA[1] = keyboard.nextDouble();
   /* ... */
   break;

使用循环(提示:向下移动for行,然后使cityA[]分配更通用)或使用循环并保持硬编码数组引用。 (我更喜欢for循环。)

很少有将break语句放入for循环体内的情况很有意义。它当然不应该在这里使用。 (在你上学的时候,你可能永远不会看到合理的案例。)

现在,问题的 meat :从单个函数返回两个数组。

认为教授建议您应该将这里的两种方法修改为单一方法,调用两次 。使您的函数足够通用以处理两个城市的数组。 (这应该不难。找到函数之间的实际不同的内容,并找出如何在参数中传递不同的数据。)

您的教授可能也希望您返回多维数组:

/* pseudo-code! */
city[][];
city[0][0] = 1; city[0][1] = 2; /* ... */
city[1][0] = 10; city[1][1] = 5; /* ... */

但目前这似乎不太可能。 (对于只有两个城市来说,它似乎也不值得。当你需要处理三个或更多城市时,请考虑这个。)

<强>更新

您的新代码看起来要好得多;你快到了。

public static double[] getHighTemperatures(String cityName, int numberOfDays)
{
    Scanner keyboard = new Scanner(System.in);
    double[] highsForNewYork = getHighTemperatures("New York", 5);
    for (int i = 0; i < numberOfDays; i++)
        highsForNewYork[i] = keyboard.nextDouble();
    return (highsForNewYork);
}

getHighTemperatures()在这里递归调用自己。而 递归函数是一种非常有用的技术,它并没有真正帮助 这里。你正在调用本质上可能是“辅助程序”的东西 用于检索任何城市的数据,并对城市进行硬编码 你对例程中的感兴趣。关。 :)

public static void main(String[]args)
{
    double[] temp = new double[5];
    String[]cities = new String[] {
        "Miami", "Dallas";
        getCityTemp(temp, cities);
    }
}

main()有城市列表,但是你的数组初始化是一个 很少。另外,我想建议你的getCityTemp()功能 试图做太多 - 你的main()应该在很高的范围内描述 等级,你试图用整个程序完成的。 (该 main()函数几乎应该像大纲一样阅读。)

public static double[] getCityTemp(double[]temp, String ... cities)
{
    Scanner keyboard = new Scanner(System.in);
    if (cities.length == 0) {
        System.out.println("No argument passed.");
        return;
    }
    String cityA = cities[0];

    for (int i = 0; i < temp.length; i++) {
        System.out.print("Enter 5 temperatures for City A. ");
        temp[i] = keyboard.nextDouble();
        if (i < cities.length) {
            cityA = cities[i];
        }
    }
    /* ... */
}

我一般都喜欢这种防御性编程 - 看到这一点 在依赖它之前已经传递了某些东西 - 但有时候是 当事情爆发时很简单Exception。这是一个细致入微的 在“内部API”应该保护自己和多少之间的位置 什么样的错误返回值从“外部API”有意义。 (这些 当应用于一个非常接近的程序时,这些术语是宏大而浮夸的 适合在一个屏幕上 - 但是当你看到并建立更大的时候,请记住这一点 程序。)

但请注意,您在功能中也有键盘输入。 (这个 可能只是迭代开发的一个功能,我回来了 这个问题已经很晚了。)限制所有键盘输入将是 best 并将输出显示为一小组功能并执行计算(I 假设您需要在下一次迭代中对数组进行排序 程序,所以你可以找到最小值,最大值,中位数,平均值,标准 另一组例程中的偏差等)。尽量保持每个功能 尽可能少地做:确保每个功能都一个

这是建议的重写:

public static void main(String[]args)
{
    String[] cities = {
        "Miami", "Dallas"
    };

    for (String city : cities) {
        double[] highs = getCityTemp(city, 5);
        printCityTemp(city, highs);
    }
}

我正在使用newer style of for loop 这避免了所有int i=0; i<array.length; i++样板代码 很多for循环都很常见。 (很多for循环遍历 数组的所有元素。)

public static double[] getCityTemp(String city, int days)
{
    Scanner keyboard = new Scanner(System.in);
    double[] highs = new double[days];

    System.out.print("Enter " + days + " temperatures for " + city + ": ");

    for (int i = 0; i < days; i++) {
        highs[i] = keyboard.nextDouble();
    }

    return highs;
}

所有输入都限制在getCityTemp(),称为多个 使用不同参数的时间来选择要显示的城市。

public static void printCityTemp(String city, double[] highs)
{
    System.out.print("Highs for " + city + " were: ");

    for (double high : highs) {
        System.out.print(high + " ");
    }

    System.out.println("");
    return;
}

这个简单的输出程序用于确保输入正确 执行。我不知道它是否适合您的应用,但它应该 在调试时很有用。

请注意,我没有对此进行测试 - 它可能编译也可能不编译。可能不是。考虑更多伪代码而不是实际代码。