java - 使用 Scanner 类读取扫描仪字符串

标签 java

我在创建一个学生类时遇到问题,该类包含一个构造函数,该构造函数采用格式为“Brookes 00918 X12 X14 X16 X21”的扫描仪字符串。条件是要有学生姓名和学号,类(class)代码以“X”开头。如果他们不满意,我会抛出In CorrectFormatExceptions。但是,当我创建一个测试类并输入一个字符串并按 Enter 时,例如“abc 123”,它不会产生通常情况下的输出。

更新:我已更改代码以使用字符串数组标记,但是现在使用“123 abc X12”的 toString() 方法会给出空指针异常。当我将“123 abc”放入构造函数中时它会起作用

更新:似乎现在可以工作,忘记初始化 arrayList

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


public class Student extends UniversityPerson{
    private String studentNumber="";
    private List<String> courses=new ArrayList<String>();
    private String studentName="";

    public int checkNoofletters(char[] chararray){
        int noofletters=0;
        for (char c:chararray){
            if (Character.isLetter(c)){
                noofletters++;
            }
        }
        return noofletters;
    }
    public String courseListinStr(){
        String stringo="";
        for (String c:courses){
            stringo+=c;
            stringo+=" ";
        }
        return stringo;
    }

    public Student(Scanner scanner) throws IncorrectFormatException{
        int studentNumberCount=0;
        int studentNameCount=0;

        Scanner s=scanner;
        String input=s.nextLine();
        String[] tokens=input.split("\\s");

        for (int i=0; i<tokens.length; i++){
            char[] chars=tokens[i].toCharArray();

            if (checkNoofletters(chars)==chars.length){//if the number of letters is equal to the character length
                if (studentNameCount==1){throw new IncorrectFormatException("Can only have 1 student name");}
                studentNameCount++;
                this.studentName=tokens[i];
                continue;
            }
            if (tokens[i].matches("[0-9]+")){//add to the studentNumbers list
                if (studentNumberCount==1){throw new IncorrectFormatException("Can only have 1 student number");}
                studentNumberCount++;
                this.studentNumber=tokens[i];

                continue;
                }

            if (!tokens[i].startsWith("X")){
                throw new IncorrectFormatException("Course code must start with an 'X'");
            }

            System.out.println(tokens[i]);
            courses.add(tokens[i]);

        } 

        if (studentNumber=="" || studentName==""){
            throw new IncorrectFormatException("Must have 1 student Number and Student Name");
        }

    }


    @Override
    public String toString() {
        //return String.format("%s %s", studentName,courseListinStr());
        return String.format("Student: %s %s", studentName,studentNumber);
    }

    @Override
    public boolean equals(Object o) {
        // TODO Auto-generated method stub
        return false;
    }



}

最佳答案

最好的方法是做这样的事情:

Scanner s=scanner;
String input = s.nextLine();
String[] tokens=input.split("\\s");

现在您可以测试所有条件:

if (tokens.size() < yourNumber) throw new Exception("add here");
if (tokens[2].charAt(0)!='X') throw new Exception("add here");

等等;根据您的要求创建学生对象应该相当容易。

关于java - 使用 Scanner 类读取扫描仪字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31762537/

相关文章:

java - 如何使用sql事务?

java - 桥接方法如何工作?

java - 如何在 Sets.newSetFromMap(map) 上执行clone()

java - 具有多个条件的长 if else 语句 - 如何替换它?

java - 为什么这个 java 输入验证循环不起作用

java - 如何检查 CachedRowSet 中是否存在列名?

Java字节图像操作

java - 如何在Java中捕获字符的存在

java - 从 Java 在终端中显示西装符号

java - Guava LoadingCache getAll - 但没有任何参数?