如何制作一个搜索并行数组的方法?

时间:2014-11-19 22:10:39

标签: java arrays algorithm

我写了一个工作的并行数组列表,存储了12个国家及其相应的人口。我的第二部作业遇到了一些麻烦。我必须创建一个方法,在数组中搜索用户输入的国家/人口。 (例如,如果用户输入“英国”,则会打印相应的人口)。但是,我不确定如何解决这个问题。 任何提示和建议将不胜感激!

import java.util.Scanner;

public class InClassModule12
   {
      public static void main(String[] args)
      {
     String[] country = {"United States", "Brazil", "China", "Italy", "United Kingdom", "Spain", "Japan", "Germany", "France", "Turkey", "South Africa", "Argentina"};
     int[] population = { 319111000, 203462000, 1367960000, 60783711, 64105654, 46507760, 127090000, 80767000, 66050000, 76667864, 54002000, 42669500};

     for ( int i = 0; i < country.length; i++ )
     { 
       System.out.print( country[i]+ "'s population: " + " ");
        System.out.print( population[i] );
        System.out.println();
     }

  }
}

编辑:这是确切的作业: 在一个程序中,您需要存储12个国家的人口。 定义两个可以并行使用的数组,以存储国家及其人口的名称。 编写一个循环,使用这些数组打印每个国家的名称及其人口。 在main方法中添加一个循环,询问用户是否想要查找给定国家/地区的人口。当它们表示“否”时,程序终止。 提示用户:您想查找哪个国家/地区? 在用户输入内容时,程序调用countryLookup方法。 countryLookup方法接受一个参数(参数),该参数包含用户为查找国家/地区输入的内容。该方法在国家/地区名称数组中搜索名称,一旦找到它,就会从种群数组中返回相应的种群。如果没有找到国家,则只返回-1。

4 个答案:

答案 0 :(得分:1)

尝试这个未经测试的代码,我已经将数组声明为成员,实现了方法并从main调用了方法。此外,请确保您将来更好地制作代码表格:

import java.util.Scanner;

public class InClassModule12 {
    public static String[] country = {"United States", "Brazil", "China", "Italy", "United Kingdom", "Spain", "Japan", "Germany", "France", "Turkey", "South Africa", "Argentina"};
    public static int[] population = { 319111000, 203462000, 1367960000, 60783711, 64105654, 46507760, 127090000, 80767000, 66050000, 76667864, 54002000, 42669500};

    public static String searchPopulation(String c) {
        for (int i = 0; i < country.length; i++) {
            if (country[i].equals(c)) {
                return population[i];
            }
        }
        return "Not found";
    }

    public static void main(String[] args)
    {

        for ( int i = 0; i < country.length; i++ ) { 
            System.out.print( country[i]+ "'s population: " + " ");
            System.out.print( population[i] );
            System.out.println();
        }
        System.out.println(searchPopulation((new Scanner(System.in)).nextLine()));

    }
}

答案 1 :(得分:1)

关于这个问题,我有两点想法。首先是它以一种面向对象的方式进行编程。也就是说,有一些数据集合,以及一些将对该数据进行操作的方法。因此,有一个类的对象实际上包含该数据,并且其方法进行处理是有意义的;而不是,例如,一个程序,其中一切都是静态的,没有任何东西被实例化。然后,main方法可以管理与用户的交互。虽然你可以将main放入存储数据的类中,但它很有意义。

我的第二个想法是,为了实际搜索数组,使用具有方法ArrayUtils的Apache公共indexOf类是有意义的,这对于这个用例是完美的。但是,我已经提出了一个替代方案,以防Gianna的老师对使用外部库有些异议。老实说,我觉得优秀的Java程序员和平庸的Java程序员之间的关键区别之一就是知道哪些类可用,以执行某些常见任务。

无论如何,存储数据的类可能如下所示。

import org.apache.commons.lang3.ArrayUtils;

public class PopulationLookup {
    private String[] countries;
    private int[] populations;

    public PopulationLookup(String[] countries, int[] populations) {
        this.countries = countries;
        this.populations = populations;
    }

    public void printAll() {
        for (int i = 0; i < countries.length; i++) {
            System.out.format(
                "Country: %s, population %d%n", countries[i], populations[i]);
        }
    }

    public int populationForCountry(String country) {
        int entry = ArrayUtils.indexOf(countries, country);
        if (entry != -1) {
            return populations[entry];
        } else {
            return -1;
        }
    }
}

这并不完美。如果两个数组的大小不同,或者其中一个数组为null,或者其他一些可能出错的事情,那么就不会出现错误处理。另外,理想情况下,您将复制所有数组条目,而不仅仅是对数组本身的引用,以防调用此类的类开始修改数组的条目。这些都是版本2中的改进。

但是这个类演示了如何将数据包装在一个对象中,如何通过构造函数传递数据,当然,搜索就在那里。

您需要将Apache commons lang3添加到构建路径才能使其正常工作。这是documented here,JAR是available from here。如果您真的不想使用外部库,可以像这样更改populationForCountry方法。

    public int populationForCountry(String country) {
        for (int i = 0; i < countries.length; i++) {
            if (countries[i].equals(country)) {
                return populations[i];
            }
        }
        return -1;
    }

然后,要完成分配,您需要包含main的类来调用它。需要注意的重点是PopulationLookup类的实例化,传递您提供的数据。

import java.util.Scanner;

public class InClassModule12 {
    public static void main(String[] args)
    {
        String[] countries = {
                "United States", "Brazil", "China", "Italy", "United Kingdom", "Spain",
                "Japan", "Germany", "France", "Turkey", "South Africa", "Argentina"};
        int[] populations = {
                319111000, 203462000, 1367960000, 60783711, 64105654, 46507760, 
                127090000, 80767000, 66050000, 76667864, 54002000, 42669500};
        try( Scanner input = new Scanner(System.in)) {

            PopulationLookup lookup = new PopulationLookup(countries, populations); 

            lookup.printAll();
            while(true) {
                System.out.println("Would you like to look up a country?");
                String response = input.nextLine();
                if (response.equalsIgnoreCase("no")) {
                    System.out.println("Good bye");
                    break;
                }

                System.out.println("What country would you like to look up?");
                String country = input.nextLine();
                int population = lookup.populationForCountry(country);
                System.out.format("The population of %s is %d%n", country, population);
            }
        }
    }
}

修改

此代码使用&#34;尝试使用资源&#34;功能,以确保Scanner在结束时关闭。这是在Java 7中引入的。如果您使用的是早期版本的Java,那么最好使用finally块来关闭Scanner。这看起来像这样。上面的Java 7代码基本上是编写相同内容的较短方式。

public class InClassModule12 {
    public static void main(String[] args)
    {
        String[] countries = {
                "United States", "Brazil", "China", "Italy", "United Kingdom", "Spain",
                "Japan", "Germany", "France", "Turkey", "South Africa", "Argentina"};
        int[] populations = {
                319111000, 203462000, 1367960000, 60783711, 64105654, 46507760, 
                127090000, 80767000, 66050000, 76667864, 54002000, 42669500};

        Scanner input = new Scanner(System.in);
        try {
            PopulationLookup lookup = new PopulationLookup(countries, populations); 

            lookup.printAll();
            while(true) {
                System.out.println("Would you like to look up a country?");
                String response = input.nextLine();
                if (response.equalsIgnoreCase("no")) {
                    System.out.println("Good bye");
                    break;
                }

                System.out.println("What country would you like to look up?");
                String country = input.nextLine();
                int population = lookup.populationForCountry(country);
                System.out.format("The population of %s is %d%n", country, population);
            }
        } finally {
            input.close();
        } 
    }
}

答案 2 :(得分:0)

您正在查找数组中用户提交的国家/地区以使用相应的索引:

for ( int i = 0; i < country.length; i++ ) { 
    if (country[i].equals(user_input)) {
        System.out.println(country[i] + "'s population: " + population[i]);
        break; // gets you out of the loop
    }
}

在变量中保存数组的长度也是一个很好的编程习惯:

for ( int i = 0, l = country.length ; i < l ; i++ ) {

否则必须在每次迭代时计算数组的长度。

答案 3 :(得分:0)

您的示例中没有用于实际收集输入的代码,这使我相信您不熟悉使用Java获取用户输入。 Scanner类是处理此问题的便捷方式,您可以在此处详细了解:Java Scanner Tutorial

您可以使用Scanner的{​​{1}}功能获取一行用户输入。

例如:

nextLine()

修改 您可以将其置于某个方法中,可能是Scanner kb = new Scanner(); String userInput = kb.nextLine(); int length = country.length; for(int i = 0; i < length; i++) { if(userInput.equals(country[i])) { System.out.println(userInput + "'s " + " population is: " + population[i]); } } ,并在searchPopulation(String country)中的循环中调用它,例如:

main

当然,您必须修改第一个代码示例,以便while(userChoice == true) { System.out.println("Please enter a country: "); String userInput = kb.nextLine(); searchPopulation(userInput); //Check if the user would like to keep going here } 的名称与方法声明中提供的名称匹配,并从第一个代码示例中删除用户输入,因为您现在正在处理它在String循环中。

编辑:您的计划中可能会出现类似内容:

while

这样,每次循环迭代时,您都会向用户询问某个国家/地区,然后将他们输入的国家/地区传递给方法import java.util.Scanner; public class TestClass { static String country[] = {"United States", "Brazil", "China", "Italy", "United Kingdom", "Spain", "Japan", "Germany", "France", "Turkey", "South Africa", "Argentina"};; static int population[] = { 319111000, 203462000, 1367960000, 60783711, 64105654, 46507760, 127090000, 80767000, 66050000, 76667864, 54002000, 42669500}; public static void main(String args[]) { boolean userChoice = true; String userInput = ""; Scanner kb = new Scanner(System.in); while(userChoice == true) { System.out.println("Please enter a country: "); userInput = kb.nextLine(); searchPopulation(userInput); //Check if the user would like to keep going here } kb.close(); } public static void searchPopulation(String userInput) { int length = country.length; for(int i = 0; i < length; i++) { if(userInput.equals(country[i])) { System.out.println(userInput + "'s " + " population is: " + population[i]); } } } } ,如果国家/地区匹配,则会搜索并输出人口。