【问题标题】:Java terminate array when enter 'done'输入“完成”时Java终止数组
【发布时间】:2016-11-22 10:01:53
【问题描述】:

更新! 我现在已经解决了最初的问题,尽管结果显示最年轻和最老的成员时出现错误并引发以下错误。有什么建议么?谢谢

线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引:4,大小:4 在 java.util.ArrayList.rangeCheck(ArrayList.java:653) 在 java.util.ArrayList.get(ArrayList.java:429) 在 NameAge.main(NameAge.java:46)

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;

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

    Integer[] ages = new Integer[10];

    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 OF ARRAY, PRODUCING ERRORS
        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");

        }

    }

【问题讨论】:

标签: java arrays arraylist


【解决方案1】:

正如 cmets 所建议的,我将在这里使用两个正则表达式,一个用于名称,一个用于年龄。另外,我会将扫描仪的输入作为字符串。目前,您正在调用Scanner.nextInt(),我认为这对于非数字数据会失败。如果发生这种情况,您检查该输入的正常应用程序逻辑将永远不会受到影响。相反,将两者都读取为字符串,然后使用正则表达式来验证输入的格式。

这样的事情应该可以工作:

String age = "35";
String name = "Tim Biegeleisen";

if (name.matches(".*[^a-zA-Z].*")) {
    System.out.println("Not a valid name");
}
if (age.matches(".*[^0-9].*")) {
    System.out.println("Not a valid age");
}

【讨论】:

    【解决方案2】:

    正如所指出的,Regex 是完成验证的最简单方法。您可能还想查看java.util.regex.Pattern (https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html) 的 javadoc。

    name.matches("\\D+") // for anything other than numbers with length > 1
    
    name.matches("\\d+") // for numbers of length 1 and more
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-26
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多