我试着做一个程序,在A和B城市里读5天的高温,我必须为城市做一个方法,把所有的10个值都取下来,然后返回给主要的方法。最初,我有一种计算方法- -4为cityA,5-9为cityB,但我的教授说这不是他想要的(尽管答案在技术上是正确的)。
很难读懂他的笔迹,但这似乎是他说要做的。
编辑-我根据建议将其转换为可变长度的参数。仍然致力于正确的返回语句,但除此之外,我认为它应该是什么样子。
EDIT#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传递回主方法?请注意,我还没有接触到对象(我已经看到了使用对象的类似主题,我也不知道如何去做)。谢谢!
发布于 2011-12-10 02:04:39
首先,这很难看:
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()有城市列表,yay,但是您的数组初始化有点偏离。另外,我想建议您的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”返回什么样的错误值之间是一个微妙的位置。(当应用于一个几乎适合于一个屏幕的程序时,这些术语是宏大的和浮夸的--但当你看到并构建更大的程序时,请记住这一点。)
但是请注意,这个函数也有键盘输入。(这可能只是迭代开发的一个函数,我很晚才回到这个问题。)最好将所有键盘输入和显示输出限制在一小部分函数中并进行计算(我假设您需要在程序的下一次迭代中对数组进行排序,这样您就可以找到最小值、最大值、中值、平均值、标准差等等)。在另一套套路中。尽量让每个函数做的尽可能少:确保每个函数都做一件事。
这里有一个建议重写:
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循环迭代数组的所有元素。)
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;
}这个简单的输出例程是为了确保输入被正确地执行。我不知道它是否适合您的应用程序,但是它在调试时应该是有用的。
请注意,我还没有测试这个--它可能编译也可能不编译。可能不会。认为它比实际代码更伪代码。
发布于 2011-12-10 01:58:30
与其尝试从一个方法返回2个数组,不如考虑如何使用相同的方法两次。
可能会使它参数化,a la
public double[] getHighTemperatures(String cityName, int numberOfDays)因此,不是有一个方法硬编码的城市A和另一个硬编码的城市B,而不是硬编码来填充一个5元素数组,你可以传递任何数量的城市,任何天数。您只需每次捕获结果。
double[] highsForNewYork = ...
double[] highsForLosAngeles = ...发布于 2011-12-10 01:59:06
您可以创建一个二维数组:
public static double[][] getCityHighs(...) {
double[] cityA = new double[5];
//....
double[] cityB = new double[5];
//....
return new double[][]{cityA, cityB};
}双将等于cityA,double1等于cityB。因此,如果您想获得cityA的第一个值,那么您将执行数组;
或者您可以创建一个存储这两个城市的类:
class cities {
double[] cityA;
double[] cityB;
}https://stackoverflow.com/questions/8453762
复制相似问题