我应该显示要搜索的STATE的降雨量值。我该怎么做?
降雨类别:
package rainfallassignment;
public class StateRainfall {
double rainAmt[]; //declare array value entered by user
int num_state = 11; //number of states in west malaysia
public StateRainfall(double rain[]) {
rainAmt = rain;
}
}
测试程序:
package rainfallassignment;
import java.util.Scanner;
public class TestRainfall {
public static void main(String[] arg) {
Scanner reader = new Scanner(System.in);
//declare constant to store size of array
int num_state = 11;
//declare array to store rainfall data
double rain[] = new double[num_state];
//array representing states
String[] state = {"Perlis", "Kedah", "Penang", "Perak",
"Kelantan", "Terengganu", "Pahang",
"Selangor", "Negeri Sembilan", "Malacca", "Johor"};
for (int i = 0; i < num_state; i++) {
System.out.println("Enter Rain value for each state: "
+ state[i] + ": ");
rain[i] = reader.nextDouble();
}
//create rainfall object
StateRainfall rain1 = new StateRainfall(rain);
for (int i = 0; i < num_state; i++) {
System.out.println("Rainfall for " + state[i] + " is: " + rain[i]);
}
}
}
我应该使用特殊命令来搜索和显示特定州的降雨量吗?
我建议您的StateRainfall
跟踪状态和降雨值,就像这样
// class
class StateRainfall {
String[] states;
double rainAmt[]; //declare array value entered by user
int num_state; //number of states in west malaysia
public StateRainfall(String[] states, double rain[]) {
this.states = states;
rainAmt = rain;
num_state = states.length;
}
}
这将允许您查看状态数组并从索引返回相应的雨值
double getRain(String state) {
for (int i = 0; i < num_state; i++) {
if (states[i].equals(state)) {
return rainAmt[i];
}
}
return -1;
}
// Just a toString() method for convenience
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < num_state; i++) {
sb.append("Rainfall for ").append(states[i]).append(" is: ").append(rainAmt[i]);
}
return sb.toString();
}
并使用所有类似的东西
StateRainfall rain1 = new StateRainfall(state, rain);
System.out.println(rain1);
System.out.println(rain1.getRain("Kelantan"));
对您的代码的几点评论:
与其使用两个(同步的)数组,不如使用Map。映射的主要目的是将值关联到键:
最好使用forEach进行迭代,或者-自java8以来-使用流进行迭代。
始终在命名变量时要小心。变量名应清楚表明其意图。读取代码时,称为“状态”的数组会产生误导。由于它是一个集合,因此最好使用复数的“状态”。
常量:由于定义了局部变量,因此您的注释“声明常量以存储数组的大小”是错误的。常量最好在类体内的方法之外定义为
private static int NUM_STATE= 11;
这也是为常量选择另一种命名方式(这里是大写字母,这有助于您以后阅读自己的代码。]
按照这些提示,您的代码将简化为:
public static void main( String[] args) { Scanner reader = new Scanner(System.in); Map<String, Double> rainMap = new HashMap<>(); //array representing states String[] state = {"Perlis", "Kedah", "Penang", "Perak", "Kelantan", "Terengganu", "Pahang", "Selangor", "Negeri Sembilan", "Malacca", "Johor"}; for ( String s : state ) { System.out.println("Enter Rain value for each state: " + s + ": "); rainMap.put( s, reader.nextDouble()); } rainMap.keySet().forEach(k -> System.out.println("Rainfall for " + k + " is: " + rainMap.get(k))); }
我认为,隐式地也回答了“搜索和显示”的问题。
您可以使用Map这样实现::>
public class StateRainfall {
Map<String, Double> rainfall;
public StateRainfall(String[] states, double[] rainFall) {
this.rainfall = new HashMap<>();
for (int i = 0; i < states.length; i++)
this.rainfall.put(states[i], rainFall[i]);
}
public static void main(String[] arg) {
Scanner reader = new Scanner(System.in);
//declare constant to store size of array
int num_state = 11;
//declare array to store rainfall data
double[] rain = new double[num_state];
//array representing states
String[] state = {"Perlis", "Kedah", "Penang", "Perak",
"Kelantan", "Terengganu", "Pahang",
"Selangor", "Negeri Sembilan", "Malacca", "Johor"};
for (int i = 0; i < num_state; i++) {
System.out.println("Enter Rain value for each state: "
+ state[i] + ": ");
rain[i] = reader.nextDouble();
}
//create rainfall object
StateRainfall rain1 = new StateRainfall(state, rain);
System.out.println("Enter state for rainfall report:");
String stateName = reader.next();
System.out.println("Rainfall for " + stateName + " is: " + rain1.getRainFall(stateName));
}
public double getRainFall(String state) {
return this.rainfall.get(state);
}
}