public static void studentNumber() throws IOException
{
int word2;
int val = 0;
System.out.println("Enter the Student Number");
word2 = sc2.nextInt();
Scanner file = new Scanner(new File("data.txt"));
System.out.println();
while(file.hasNextLine())
{
String line = file.nextLine();
if(line.indexOf(word2) != -1)
{
System.out.println("The student" +word2+ " exists in our system, their phone number is");
val = 1;
break;
}
else
{
val = 0;
continue;
}
}
if(val == 0)
{
System.out.println("The student " +word2+ " does not exist in our system");
}
}
}
允许用户根据
搜索学生数据以下是我的文本文件中的列表示例:
Barrett,Zulema,848284,M,3A1,3H2,S3,961025,2891374756,,CHT3O0ACLU3M0BENG3C0EHIR3C0AMBF3C0CPPL3OMAPPL4OMCSBI3C0B
答案 0 :(得分:0)
以下代码部分可能存在一些可能不受欢迎的行为:
if(line.indexOf(word2) != -1)
{
System.out.println("The student" +word1+ "," +word2 +"exists in our system, their phone number is" );
val = 1;
break;
}
println命令不会尝试输出找到的学号,也没有代码可以从行中提取。这些是此代码不输出学号的主要原因。将变量分配给学生编号并将其包含在输出语句中。可以使用字符串拆分(参见下面的第3点)来提取此信息。
if测试仅检查字符串中存在word2的条件,但文本输出意味着word1和word2都出现在测试行中。 (这个逻辑也更容易理解你使用了surname和first_name变量。)
使用indexOf检查行中是否存在字符串将返回任何子字符串匹配的误报,包括任何位置的部分字符串。例如寻找姓氏"亚当斯"也将匹配" Adamson"。如果使用逗号分隔符拆分字符串并为每个元素指定有意义的名称,则可以区分记录的哪个部分匹配。 See this thread for ideas on Java String splitting
在每个找到的行之后包含一个中断将意味着只找到1个匹配。输出匹配数据或将找到的数据添加到集合中将避免错过项目。
解决这4点应该可以提高searchStudentName()具有所需行为的机会,这些也可以应用于studentNumber()。
可以改进此代码的其他一般性观察是:
使用有意义的名称和严格类型来确定是否找到了匹配" int val"类似于" boolean foundMatchingRecord"。
创建一个轻型java对象,以保存每条记录中有意义名称的所有属性,并添加丰富的询问方法,例如" matchesFirstNameAndSurname()"
当您仍然可以区分用户控制台输入问题和文件读取问题以添加有用的失败消息并退出状态时,处理IOException。
为所有逻辑和单元测试创建一个POJO来测试它,而不是与main()方法在同一个类中的一组静态方法。
答案 1 :(得分:0)
以下是使用String.split()将记录分成单个字段的示例:
public static class Student{
public String firstName;
public String surname;
public int number;
public String field04;
public String field05;
public String field06;
public String field07;
public String field08;
public String field09;
public String field10;
public String field11;
}
@Test
public void expectToFindAMatchForFirstNameAndSurname() {
// Test parameters
String record = "Barrett,Zulema,848284,M,3A1,3H2,S3,961025,2891374756, ,CHT3O0ACLU3M0BENG3C0EHIR3C0AMBF3C0CPPL3OMAPPL4OMCSBI3C";
String firstNameToFind = "Zulema";
String surnameToFind = "Barrett";
// Split String
String[] fields = record.split(",");
Student student = new Student();
if (fields.length >= 1) student.surname = fields[0];
if (fields.length >= 2) student.firstName = fields[1];
if (fields.length >= 3) student.number = Integer.parseInt(fields[2]);
if (fields.length >= 4) student.field04 = fields[3];
if (fields.length >= 5) student.field05 = fields[4];
if (fields.length >= 6) student.field06 = fields[5];
if (fields.length >= 7) student.field07 = fields[6];
if (fields.length >= 8) student.field08 = fields[7];
if (fields.length >= 9) student.field09 = fields[8];
if (fields.length >= 10) student.field10 = fields[9];
if (fields.length >= 11) student.field11 = fields[10];
// Check with names the correct way round
Assert.assertTrue(firstNameToFind.equals(student.firstName));
Assert.assertTrue(surnameToFind.equals(student.surname));
Assert.assertTrue(firstNameToFind.equals(student.firstName) && surnameToFind.equals(student.surname));
Assert.assertTrue(record.indexOf(firstNameToFind) != -1 && record.indexOf(surnameToFind) != -1);
// Check with first name and surname reversed
Assert.assertFalse(firstNameToFind.equals(student.surname));
Assert.assertFalse(surnameToFind.equals(student.firstName));
Assert.assertFalse(firstNameToFind.equals(student.surname) && surnameToFind.equals(student.firstName));
Assert.assertTrue(record.indexOf(surnameToFind) != -1 && record.indexOf(firstNameToFind) != -1);
}
在这个例子中,注意到indexOf与整行交换的firstname和surname如何仍然找到匹配。