我正在尝试制作一个能够在城市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的类似主题,我不明白该怎么做)。谢谢!
答案 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;
}
这个简单的输出程序用于确保输入正确 执行。我不知道它是否适合您的应用,但它应该 在调试时很有用。
请注意,我没有对此进行测试 - 它可能编译也可能不编译。可能不是。考虑更多伪代码而不是实际代码。