首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从同一方法返回两个数组?

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

Stack Overflow用户
提问于 2011-12-10 01:50:06
回答 5查看 5.6K关注 0票数 1

我试着做一个程序,在A和B城市里读5天的高温,我必须为城市做一个方法,把所有的10个值都取下来,然后返回给主要的方法。最初,我有一种计算方法- -4为cityA,5-9为cityB,但我的教授说这不是他想要的(尽管答案在技术上是正确的)。

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

编辑-我根据建议将其转换为可变长度的参数。仍然致力于正确的返回语句,但除此之外,我认为它应该是什么样子。

EDIT#2 -我刚刚意识到字符串城市在主要方法中被命名为城市。修正了,但现在我又犯了一个错误。返回值丢失?我在做书上说的-书中的例子.

代码语言:javascript
复制
printMax(new double[] {1, 2, 3});
if (numbers.length == 0) {
System.out.println("No argument passed");
return;

________最新代码

代码语言:javascript
复制
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);
}

________新码

代码语言:javascript
复制
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];
            }
        }
    }
}

下面的________是旧代码

代码语言:javascript
复制
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传递回主方法?请注意,我还没有接触到对象(我已经看到了使用对象的类似主题,我也不知道如何去做)。谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-10 02:04:39

首先,这很难看:

代码语言:javascript
复制
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循环的主体中的情况很少有意义。当然不应该在这里用。(在上学的时候,你可能看不到合理的情况。)

现在,回到问题的核心:从一个函数返回两个数组。

我认为教授的建议是,你应该修改这里的两种方法,变成一个你两次调用的方法。使您的函数足够通用,以处理两个城市的数组。)这不应该很难。查找函数之间的实际差异,并找出如何在参数中传递不同的数据。)

您的教授可能还希望您返回一个多维数组:

代码语言:javascript
复制
/* pseudo-code! */
city[][];
city[0][0] = 1; city[0][1] = 2; /* ... */
city[1][0] = 10; city[1][1] = 5; /* ... */

但就目前而言,这似乎不太可能。(仅对两个城市来说,这似乎也不值得。想一想,当你需要处理三个或更多的城市。)

更新

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

代码语言:javascript
复制
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()在这里递归地调用自己。虽然递归函数是一种非常有用的技术,但它在这里并没有真正的帮助。您调用的本质上是一个“助手例程”,可以用于检索任何城市的数据,并在例程中对您感兴趣的城市进行硬编码。关。:)

代码语言:javascript
复制
public static void main(String[]args)
{
    double[] temp = new double[5];
    String[]cities = new String[] {
        "Miami", "Dallas";
        getCityTemp(temp, cities);
    }
}

main()有城市列表,yay,但是您的数组初始化有点偏离。另外,我想建议您的getCityTemp()函数做得太多了--您的main()应该在很高的级别上描述您试图用整个程序完成的任务。( main()函数几乎应该像提纲一样读取。)

代码语言:javascript
复制
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”返回什么样的错误值之间是一个微妙的位置。(当应用于一个几乎适合于一个屏幕的程序时,这些术语是宏大的和浮夸的--但当你看到并构建更大的程序时,请记住这一点。)

但是请注意,这个函数也有键盘输入。(这可能只是迭代开发的一个函数,我很晚才回到这个问题。)最好将所有键盘输入和显示输出限制在一小部分函数中并进行计算(我假设您需要在程序的下一次迭代中对数组进行排序,这样您就可以找到最小值、最大值、中值、平均值、标准差等等)。在另一套套路中。尽量让每个函数做的尽可能少:确保每个函数都做一件事。

这里有一个建议重写:

代码语言:javascript
复制
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,它避免了许多for循环中常见的所有int i=0; i<array.length; i++样板代码。(大量的for循环迭代数组的所有元素。)

代码语言:javascript
复制
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()上,它被多次调用,使用不同的参数来选择将显示哪个城市。

代码语言:javascript
复制
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;
}

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

请注意,我还没有测试这个--它可能编译也可能不编译。可能不会。认为它比实际代码更伪代码。

票数 2
EN

Stack Overflow用户

发布于 2011-12-10 01:58:30

与其尝试从一个方法返回2个数组,不如考虑如何使用相同的方法两次。

可能会使它参数化,a la

代码语言:javascript
复制
public double[] getHighTemperatures(String cityName, int numberOfDays)

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

代码语言:javascript
复制
double[] highsForNewYork = ...
double[] highsForLosAngeles = ...
票数 3
EN

Stack Overflow用户

发布于 2011-12-10 01:59:06

您可以创建一个二维数组:

代码语言:javascript
复制
public static double[][] getCityHighs(...) {
    double[] cityA = new double[5];
    //....
    double[] cityB = new double[5];
    //....
    return new double[][]{cityA, cityB};
}

双将等于cityA,double1等于cityB。因此,如果您想获得cityA的第一个值,那么您将执行数组;

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

代码语言:javascript
复制
class cities {
    double[] cityA;
    double[] cityB;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8453762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档