我必须编写一个程序,允许用户使用两个ArrayList(国家和首都)跟踪他访问过的所有国家及其首都。用户可以从菜单中选择三个选项,他可以:
>
通过输入国家的名称,在系统中查询国家的首都。(如果访问了该国,则应显示首都,否则应向其发送错误消息:“您没有访问该国”)。
退出程序
例如,arraylist国家包含[“英格兰”、“法国”、“留尼汪”、“尼泊尔”],首都包含[“伦敦”、“巴黎”、“圣丹尼斯”、“加德满都”]。如果用户访问过首都为内罗毕的肯尼亚,并希望将其添加到ArrayList中,则国家和首都ArrayList应分别为:[“英格兰”、“法国”、“留尼汪”、“尼泊尔”、“肯尼亚”],首都包含[“伦敦”、“巴黎”、“圣丹尼斯”、“加德满都”、“内罗毕”]。如果他想查询法国首都,系统应该显示“巴黎”。如果用户希望查找澳大利亚首都,系统应显示“您没有访问过该国”。
以下是我到目前为止得出的结论:
import java.util.*;
public class MyClass {
public static void main(String[] args) {
ArrayList<String> countries = new ArrayList<String>();
Scanner sc = new Scanner(System.in);
String country;
String capital;
String search;
countries.add("England");
countries.add("France");
countries.add("Reunion");
countries.add("Nepal");
ArrayList<String> capitals = new ArrayList<String>();
capitals.add("London");
capitals.add("Paris");
capitals.add("St Denis");
capitals.add("Kathmandu");
System.out.println("Please choose one option:");
System.out.println("1. Add a new country and its capital.");
System.out.println("2. Search for the capital of a country.");
System.out.println("3. Exit.");
int opt = sc.nextInt();
if (opt == 1) {
country = sc.nextLine();
capital = sc.nextLine();
countries.add(country);
capitals.add(capital);
} else if (opt == 2) {
System.out.println("Enter the capital of the country.");
search = sc.next();
for (int i = 0; i < countries.size(); i++) {
for (int j = 0; j < capitals.size(); j++) {
if (search.equals(capitals.get(j))) {
System.out.println("The country is " + countries.get(i));
}
}
}
} else {
System.exit(0);
}
}
}
但实际上,for
循环显然不像我进入首都时那样有效,程序就在那里终止。
编辑:我不能使用HashMap,但可以使用列表
你的方法有一个问题:有些国家有不止一个资本
我认为适合您需求的良好数据结构将是
Map<County,Capital[]>
地图非常有用,文档在这里
我想:如果我去了梵蒂冈城邦,我会同时在罗马,虽然不在意大利。好如果梵蒂冈城有一个机场,那是真的,否则我以前肯定去过意大利
哦男孩。这里有很多问题。
首先:对于for循环,您的代码没有问题(与您所称的问题相关)。
main方法只执行一个if分支,然后终止。如果希望程序在每次完成操作后重新运行并提示菜单,直到请求终止选项,则需要将菜单包装在while循环中:
int opt= sc.nextInt();
while (opt != 3) {
if (...)
}
System.exit(0);
第二点:在Java中,通常不使用成对数组(即,两个数组通过其元素的位置进行语义链接)。您可以创建一个类:
class CountryAndCapital {
String country;
String capital;
//...
}
ArrayListy<CountryAndCapital> myArray = new ArrayList<>();
或者,正如其他人所建议的,使用地图,这是一种数据结构,将一个数据链接到另一个数据(在本例中,是首都到国家),并防止重复(从某种意义上说……):
Map<String, String> countryToCapital = new HashMap<>();
countryToCapital.put("France", "Paris");
//...
最后:如果您的数组是成对的,则不需要对这两个数组进行迭代!您可以迭代国家一级,然后将该索引移到首都一级:
for(int i=0; i<capitals.size();i++) {
if(search.equals(capitals.get(i))) {
System.out.println("The country is "+countries.get(i));
}
}
您只需使用HashMap
,国家为键
,首都为值
:
HashMap<String, String> hashMap = new HashMap<String, String>();
// add data to the HashMap
hashMap.put("England", "London"); //assign value "London" to key "England"
// get data from the HashMap
hashMap.get("England"); //returns "London"
编辑:如果仍要使用列表,可以执行以下操作来检索相应的值。这样做的好处是它可以双向工作:
capitals.get(countries.indexOf("England")); //it will return "London"
countries.get(capitals.indexOf("London")); //it will return "England"
注:只有在列表顺序正确的情况下(第一个国家与第一个首都匹配,第二个国家与第二个首都匹配,等等),这才有效
写一个函数,以一个数组作为输入,并返回一个数组。返回的数组包含来自输入的偶数和奇数和。 如果任何输入为null,则应将其视为空数组
问题内容: 我有一个整数数组,我试图找到该数组中所有值的LCM(最小公倍数)。我已经单独写了一个方法;它接受两个值作为输入,并返回lcm。我的方法工作得很好,但是当我用它来查找所有值的LCM时,我得到了错误的答案。 这是我和的方法: 这是我对数组值的lcm的要求: 当我放入一个数字1到5为,0为as 且数组的长度为的数组时,得到30作为答案,而我想要60。当我放入一个包含从1到1的所有数字的数组时
问题内容: 我已经阅读了这个问题,但是我仍然不确定是否可以在Java中将指向方法的指针保留在Java数组中,如果有人知道这样做是否可行,那将是真正的帮助。我正在尝试找到一种优雅的解决方案,在不编写成百上千个“ if”的情况下保留字符串列表和相关函数。 干杯 问题答案: Java本身没有函数指针(或C#说法中的“委托”)。这种事情往往是用匿名子类来完成的。
你会得到一个由n个整数组成的数组,包括负整数和正整数。您需要将它们划分为两个不同的数组,而不直接将任何元素与0、1、-1或任何其他固定值进行比较。将0视为正数。如果arr[0]是正数,则在第一行输出中按给定顺序打印所有正数,然后在第二行输出中按给定顺序打印所有负数,反之亦然。注意:如果数组只包含正数,那么在第一行打印正数,在第二行打印“数组没有负数”。如果数组只包含负数,则在第一行打印负数,在第二
问题内容: 用Java制作数组列表的语法是什么? 我尝试了以下方法: 还有很多其他事情 我需要能够对int数组进行重新排序,但是int数组的元素不需要更改。如果这不可能,为什么呢? 谢谢。 问题答案: 首先,您不能做的是接口。 要列出int数组,请执行以下操作: PS 根据评论,List的包和ArrayList的包
问题内容: 好的,我一直在Google搜索网络,但似乎找不到解决我问题的任何方法。我找到了很多解决方案,但都不合适。 我需要创建一个泛型数组。但是泛型类型本身扩展了Comparable。当我尝试以下操作时: 问题在于对象不能转换为扩展Comparable的泛型。有没有解决的办法? 问题答案: 泛型和数组基本上不混合。简短的答案是你可以解决此问题。较长的答案是你可能不应该这样做,我将解释原因。 你可
问题内容: 给定不同整数的数组,打印数组的所有排列。 例如: 问题答案: 我们可以借助递归来解决问题。递归很难解释,所以我创建了一个递归树来演示它。 这是相同的代码。 当你运行上面的程序时,你会得到以下输出: 我已经用下图说明了递归是如何在这里工作的。 您需要在新窗口中打开此图表并对其进行缩放。 由于数组中有 3 个元素,因此每个节点有 3 个分支。
问题内容: 为什么m和t都是假的?比较Java中2个数组的正确方法是什么? 问题答案: 使用Arrays.equals方法。例: