我写了一个工作的并行数组列表,存储了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。
答案 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]);
}
}
}
}
,如果国家/地区匹配,则会搜索并输出人口。