вернуть два массива из одного метода? - PullRequest
1 голос
/ 10 декабря 2011

Я пытаюсь создать программу, которая будет считывать высокие температуры в течение 5 дней в городе А и городе Б. Я должен создать метод для городов, который будет принимать все 10 значений и возвращать их в основной метод. Первоначально у меня был единственный метод, который считал бы [0] - [4] как cityA и [5] - [9] как cityB, но мой профессор сказал, что это не то, что он хочет (даже если ответ технически правильный).

Трудно прочитать его почерк, но, похоже, именно это он и говорил.

РЕДАКТИРОВАТЬ- Я превратил его в параметр переменной длины в соответствии с предложениями. все еще работаю над получением правильного выражения return, но в остальном он выглядит так, как мне кажется.

РЕДАКТИРОВАТЬ # 2 - я только что понял, что строковые города назвали город в основном методе. исправил, но теперь я получаю еще одну ошибку. Возвращаемое значение отсутствует? Сейчас я делаю то, что написано в книге - пример в книге ...

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 обратно в основной метод? Обратите внимание, что я еще не дошел до Objects (я видел похожие темы, где используется Object, и я не понимаю, как это сделать). Спасибо!

Ответы [ 5 ]

3 голосов
/ 10 декабря 2011

Вы можете создать двумерный массив:

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;
}
3 голосов
/ 10 декабря 2011

Вместо того, чтобы пытаться получить 2 массива, возвращаемых одним методом, подумайте, как вы можете использовать один и тот же метод дважды.

Возможно, сделайте его параметризованным, например,

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

Таким образом, вместо того, чтобы иметь метод, жестко закодированный для города A, и другой, жестко закодированный для города B, и вместо того, чтобы жестко кодировать его,5 элементов массива, вы можете передать любое количество городов, любое количество дней.Вы просто фиксируете результаты каждый раз.

double[] highsForNewYork = ...
double[] highsForLosAngeles = ...
2 голосов
/ 10 декабря 2011

Во-первых, это довольно уродливо:

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.Это, конечно, не должно использоваться здесь.(Вы, возможно, никогда не увидите разумного случая, пока будете в школе.)

Теперь перейдем к мясу вашего вопроса: возврат двух массивов из одной функции.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. *.Сделайте вашу функцию достаточно универсальной, чтобы обрабатывать массивы обоих городов.(Это не должно быть сложно. Найдите, что на самом деле отличается между функциями, и выясните, как передать различные данные в параметре.)

Ваш профессор, возможно, также хотел, чтобы вы вернулимногомерный массив:

/* 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 ограничить весь ввод с клавиатуры и вывод на дисплей небольшим набором функций и выполнить вычисление (я предполагаю, что вам нужно отсортировать массивы на следующей итерации вашей программы, чтобы вы могли найти минимум, максимум, медиану, среднее, стандартное отклонение и т. д.) в другом наборе подпрограмм.Старайтесь, чтобы каждая функция выполнялась как можно меньше: убедитесь, что каждая функция выполняет одну вещь.

Вот рекомендуемая перезапись:

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

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

Яиспользуя более новый стиль 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;
}

Эта простая процедура вывода предназначена для того, чтобы убедиться, что ввод был выполнен правильно.Я не знаю, идеально ли это для вашего приложения, но это должно быть полезно при отладке.

Обратите внимание, что я не проверял это - он может или не может скомпилировать.Возможно нет.Считайте, что это * псевдокод , чем фактический код.

2 голосов
/ 10 декабря 2011

Вы должны использовать двумерный массив, где первое измерение - 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.

2 голосов
/ 10 декабря 2011

Ваши 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`
}
...