当前位置: 首页 > 知识库问答 >
问题:

2 arraylist中的Java数组

唐炜
2023-03-14

我必须编写一个程序,允许用户使用两个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,但可以使用列表

共有3个答案

扈瑞
2023-03-14

你的方法有一个问题:有些国家有不止一个资本

我认为适合您需求的良好数据结构将是

Map<County,Capital[]>

地图非常有用,文档在这里

我想:如果我去了梵蒂冈城邦,我会同时在罗马,虽然不在意大利。好如果梵蒂冈城有一个机场,那是真的,否则我以前肯定去过意大利

蓝恩
2023-03-14

哦男孩。这里有很多问题。

首先:对于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));
  }
}
仰翰采
2023-03-14

您只需使用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方法。例: