【问题标题】:Java terminate program upon user entry 'done'Java 在用户输入“完成”时终止程序
【发布时间】:2016-11-22 13:08:01
【问题描述】:

我正在处理一个存储名称字符串和年龄整数的数组,我希望该数组最大为 4 并打印出这些结果,除非用户输入单词“完成”,如果是这样的话程序终止,数组输出它存储的内容。

数组工作正常,但似乎无法获得“完成”部分,我目前正在使用带有 .equals 的 if 语句

有什么建议吗?

谢谢

import java.util.Scanner;
import java.util.ArrayList;

public class NameAge {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        final int MAX_VALUE = 4;
        //boolean name = false;

        ArrayList<String> nameList = new ArrayList<String>();
        ArrayList<Integer> ageList = new ArrayList<Integer>();

        Integer[] ages = new Integer[4];

        for (int i = 0; i < MAX_VALUE; i++) {

            System.out.print("Enter a name: ");
            String currentLine = input.next();

            if (currentLine.equals("done")) {
            break;
            }

            nameList.add(currentLine);

            System.out.print("Now enter an age for " + currentLine + ": ");
            ageList.add(input.nextInt());

          }

        System.out.print("\n");
        for(int i = 0; i < MAX_VALUE; i++) {

            System.out.println("Name: " + nameList.get(i) + "   Age: " + ageList.get(i));


        }


    // display youngest and oldest member of array
    int smallest = ageList.get(0);
        int largest = ageList.get(0);

        String oldest = nameList.get(0);
        String youngest = nameList.get(0);

        for (int i = 0; i < ages.length; i++) {
            if(ageList.get(i) > largest) {
                largest = ageList.get(i);
                oldest = nameList.get(i);

            } else if(ageList.get(i) < smallest) {
                smallest = ageList.get(i);
                youngest = nameList.get(i);
            }
        }
                        System.out.println("\nThe youngest person is " + youngest + " who is " + smallest + " years old");
            System.out.println("The oldest person is " + oldest + " who is " + largest + " years old");


        }

    }

【问题讨论】:

  • 您的nameListArrayList,虽然不等于String "DONE"。此外,您的变量 name 似乎没用,因为它的唯一用途是在 if 内部,它被设置为 true。您可能希望将if 语句之前的输入读入String input;,然后从那里确定您当前的输入应该做什么。

标签: java arrays if-statement


【解决方案1】:

好的,该代码中有几件事需要查看。

变量name 在那里没有任何作用,因为它只是在每次迭代中设置为true。 (您可能会混淆 === 内的 if 声明?

那么,nameList是一个ArrayList,所以不能和String比较,需要得到ArrayList的值i然后比较,如:

if (nameList.get(i).equals("DONE")) {    
    break; 
}

【讨论】:

    【解决方案2】:
    • 去掉布尔变量这个名字,好像没什么用。

    • 为什么要使用两台扫描仪。一个就够了。

           Scanner input2 = new Scanner(System.in);
      

      不需要。

    • 将第一个 input.nextLine() 存储在临时变量中而不是最终列表中,以便决定做什么:继续或停止:

      String currentLine = input.nextLine()

    • ages 数组不是必需的。您已经有一个存储年龄值的列表:

      ArrayList&lt;Integer&gt; ageList

    • Scanner.nextLine() 读取整行。它可能有副作用。在您的情况下,您只需要线路当前输入:仅使用 next() 或 nextInt()。

    它应该做的工作:

      public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
    
        final int MAX_VALUE = 4;
    
        ArrayList<String> nameList = new ArrayList<String>();
        ArrayList<Integer> ageList = new ArrayList<Integer>();
    
        for (int i = 0; i < MAX_VALUE; i++) {
    
            System.out.print("Enter a name: ");
            String currentLine = input.next();
    
            if (currentLine.equals("DONE")) {
            break;
            }
    
            nameList.add(currentLine);
    
            System.out.print("Now enter an age for " + currentLine + ": ");
            ageList.add(input.nextInt());
    
          }
    
        }    
    

    【讨论】:

    • 谢谢! @davidxxx。我现在在我的原始帖子中看到了下面的其他代码,显示了最高和最低的姓名和年龄(包含在数组中)虽然应用您的解决方案会产生以下错误 - 线程“main”java.lang.IndexOutOfBoundsException中的异常:索引:3 , Size: 3 at java.util.ArrayList.rangeCheck(ArrayList.java:653) at java.util.ArrayList.get(ArrayList.java:429) at NameAge.main(NameAge.java:35) 有什么建议吗?跨度>
    • 您的异常是指对 ArrayList 实例的 get() 调用,在我的代码中,我不在 ArrayList 实例上使用 get() 方法
    【解决方案3】:

    首先,你为什么需要:if(name = true) {} 你不需要那个,如果你想测试 name 是否为真,你使用 double ==

    其次,使用这一行:nameList.equals("DONE") 您正在检查 ArrayList nameList 对象是否等于“DONE”。您没有检查 ArrayList 的元素。

    如果您想在有人输入单词“DONE”时停止您的程序,那么代码如下:

    Scanner input = new Scanner(System.in);
    Scanner input2 = new Scanner(System.in);
    
    final int MAX_VALUE = 4;
    boolean name = false;
    String chk = "";
    
    ArrayList<String> nameList = new ArrayList<>();
    ArrayList<Integer> ageList = new ArrayList<>();
    
    Integer[] ages = new Integer[4];
    
    for (int i = 0; i < MAX_VALUE; i++) {
    
        System.out.print("Enter a name: ");
    
        chk = input.nextLine();
    
        if (chk.equals("DONE"))
            break;
    
        nameList.add(chk);
    
        System.out.print("Now enter an age for " + nameList.get(i) + ": ");
        ageList.add(input2.nextInt());
    
    }
    

    如果你想在数组中输入单词“DONE”,然后检查数组是否包含“DONE”,那么代码是这样的:

    Scanner input = new Scanner(System.in);
              Scanner input2 = new Scanner(System.in);
    
              final int MAX_VALUE = 4;
              boolean name = false;
              String chk = "";
    
              ArrayList<String> nameList = new ArrayList<>();
              ArrayList<Integer> ageList = new ArrayList<>();
    
              Integer[] ages = new Integer[4];
    
              for(int i = 0; i < MAX_VALUE; i++ ) {
    
                      System.out.print("Enter a name: ");
                      nameList.add(input.nextLine());
                      if (nameList.contains("DONE"))    //use contains
                          break; 
    
    
    
                  System.out.print("Now enter an age for " + nameList.get(i) + ": ");
                  ageList.add(input2.nextInt());              
    
              }  
    

    【讨论】:

      【解决方案4】:

      索引超出范围的原因是因为您将最大值设置为 4,即使数组较小,您也会尝试循环。由于您有一个与年龄相关联的人,您可以使用 HashMap 将 name 设置为 key,将 age 设置为 value,然后在添加新条目后使用 lambda 表达式打印 hashmap,如下所示:

          Scanner input = new Scanner(System.in);
          final int MAX_VALUE = 4;
          HashMap<String, Integer> people = new HashMap<String, Integer>();
      
          for (int i = 0; i < MAX_VALUE; i++) {
              System.out.print("Enter a name: ");
              String name = input.next();
      
              if (name.equals("done")) {break;}
      
              System.out.print("Now enter an age for " + name + ": ");
              int age = input.nextInt();
      
              people.put(name, age);
          }
          input.close();
          System.out.print("\n");
          people.forEach((k,v)->System.out.println("Name : " + k + "  Age : " + v));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        • 2022-01-01
        • 2014-02-09
        相关资源
        最近更新 更多