显示输出后如何在数组中搜索元素?

问题描述 投票:0回答:3

我应该显示要搜索的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]);

        }

    }

}

我应该使用特殊命令来搜索和显示特定州的降雨量吗?

java
3个回答
1
投票

我建议您的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"));

2
投票

对您的代码的几点评论:

  1. 与其使用两个(同步的)数组,不如使用Map。映射的主要目的是将值关联到键:

  2. 最好使用forEach进行迭代,或者-自java8以来-使用流进行迭代。

  3. 始终在命名变量时要小心。变量名应清楚表明其意图。读取代码时,称为“状态”的数组会产生误导。由于它是一个集合,因此最好使用复数的“状态”。

  4. 常量:由于定义了局部变量,因此您的注释“声明常量以存储数组的大小”是错误的。常量最好在类体内的方法之外定义为

        private static int NUM_STATE= 11;
    

这也是为常量选择另一种命名方式(这里是大写字母,这有助于您以后阅读自己的代码。]

  1. 资源(如扫描仪)应始终关闭,以释放使用的内存。在我的示例中,由try-with-resource结构完成。您也可以使用try..finally块。
  2. 按照这些提示,您的代码将简化为:

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)));
}

我认为,隐式地也回答了“搜索和显示”的问题。


1
投票

您可以使用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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.