2015-03-31 38 views
0

我是一年级的编程学生,所以如果这是一个愚蠢的问题,请原谅我。如何从一个文本行创建多个数组?

我想要做的是读取一个文本文件,其中包含第1行的答案关键字,并且后续行将包含学生的ID号和他们对测试的答案。这里有一个例子:

TFFTFFTTTTFFTFTFTFTT 
ABC54301 TFTFTFTTTTF TFTFTFTT 
ABC54302 TFFTFFFFFFFFTFTFTFTT 
ABC54303 TFFTFFTTTTFFTFTTTTTT 
ABC54304 TFFTTTFFTTFFTFTFTFTT 
ABC54305 TFTFTFTTTTFFTFTFTFTT 

我的想法是创建三个阵列 - 一个只包含了接听键,一个包含学生的ID号,以及一个包含studentss答案。学生身份证号码总是8位数字,但可能包含空格。学生的答案总是20个字符,但也可以包含空格。所以我不能根据空格来分割它们。

的说明包含在此:

while (inFile.hasNext()) 
{ 
    ... 
} 

where 'inFile' is the Scanner object connected to the input file. 

Each student's record should be read by two read's -- 
one string (for ID) and another string (answer string). 

我几乎失去了。我最初的想法是循环遍历第一行,并将行的每一段设置为它的补充数组。我接触到的问题是,我似乎无法找到任何指示或澄清如何根据字符数来分割线条。

我想也许是这样的:

while (inFile.hasNext()) 
{ 
    // I would somehow set the first line to its own array 
    // As the loop continues, as long as its not the first line 
    idNums[i] =  //Characters 1-8 
    studentAnswers[i] =  //Characters 10-30 
} 

是合理的?还是有更简单的方法?我觉得我正在以一种比必要更复杂的方式来解决这个问题。

编辑:

学习更多有关地图和正则表达式之后,我尝试几个不同的版本这个代码。第一个包括了:

while (scan.hasNextLine()) { 
    String[] studentInfo = scan.nextLine().split(" ", 2); 
    info.put(studentInfo[0], studentInfo[1]); 
} 

哪一种工作,但问题是,如果它用空格结束,它不会保存完整的20个字符。这是一个问题吗?我不确定。目前我测试这个:

String[] answerKey = scan.nextLine().split(""); 

Map<String, String[]> results = new HashMap<>(); 
while (scan.hasNextLine()) { 
    String line = scan.nextLine(); 
    results.put(line.substring(0, 8), line.substring(9).split("")); 
} 

这是给我正确的钥匙,但不正确的值。这些值似乎指向内存位置。例如:

{ABC54339=[Ljava.lang.String;@55f96302 

回答

0

在while循环之前先读取第1行。你可以把它变成一个这样的数组:

String[] answers = inFile.nextLine().split(""); 

通知,正则表达式告诉拆分每个字符之间的分裂。

然后阅读结果,最好将学生ID和他们的答案保存在一起 - 地图是一个明显的选择,因为它存储键/值对,但也因为它会自动增长。

使用子字符串获取该行的前8个字符并获取结果,并在地图中显示put()。将结果值存储为一个数组,使用上面的相同拆分调用创建。

Map<String, String[]> results = new HashMap<>(); 
while ... 
    results.put(line.substring(0, 8), line.substring(9).split("")); 

仅供参考,如果你使用的是Java 8,你可以做一个行(即没有环),虽然它有点火车失事的:

Map<String, String[]> results = StreamSupport 
    .stream(Spliterators.spliteratorUnknownSize(inFile, 0)) 
    .collect(Collectors.toMap(s -> s.substring(0, 8), s -> s.substring(9).split("")); 

由于另外,如果你的老师给了你初始代码供你填写,这就清楚地表明他或她的软件设计技能很差;扫描器变量不应该包含单词“文件”,因为它在输入流上运行,而不仅仅是文件输入流 - 例如,您的代码可以通过命令行运行输入。代码不应该知道,关心或建议输入的特定来源:scanner或简单地in将是更好的选择。

+0

由于我还没有了解地图 - 但是听到从一对夫妇在这里的用户,那将是我如何处理这个问题,你介意提供一个小一点。的骨架代码或伪代码举例说明地图在这种情况下的工作方式?我正在使用Java 8. – ccsum 2015-03-31 21:04:59

+0

我想我犯了一个简单的错误,但我看不到它是什么。我在过去的几个小时里一直在研究地图和正则表达式 - 也许我一直在考虑这个太久,或者我只是在做一些错误的事情。 将用新代码更新原始帖子。我在评论中试了一下,它不起作用 - 哎呀! – ccsum 2015-04-01 00:16:34

+0

与java 8你可以使用空白正则表达式'“”'分割每个字符 - 不要学习正则表达式(它会炒你的大脑)。忽略java 8代码 - 这仅仅是为了兴趣。尝试简单的循环 - 它应该工作。循环后打印地图,看看它的工作。然后你可以迭代map.entrySet()' – Bohemian 2015-04-01 00:25:37

0

因为你的指令明确地说,你应该让2读取,我发现最好的方法阅读This Documentation满足这些指令是Scanner.Next(string)

它看起来像“模式”参数期望一个正则表达式后, http://rubular.com/是用于尝试使用正则表达式的很好的资源,它也为基本的正则表达式语法提供了参考。

为了您的方便,匹配8个字符的正则表达式是这样".{8}"

如果你使用正则表达式,请确保你逃避,你使用正则表达式转义序列(上逃生的所有\小号java和1为正则表达式语言),所以要匹配数字数字,您必须使用"\\d"

+0

感谢你链接文档和链接!我一定会考虑这些资源。我们还没有学过正则表达式,所以在解决这个问题的时候我会学习。这个问题的章节内容是关于数组的。 – ccsum 2015-03-31 21:01:32

+0

经过几个小时的实验后,我似乎无法得到正则表达式正常工作。我只需要一定数量的字符就可以停止,但您推荐的分隔符(“。{8}”)似乎不起作用。空间工作,但我需要保留空间。我现在很难过,但我会继续努力。 – ccsum 2015-04-01 00:26:46

0

将第一行读入字符串并将其保留为字符串(该字符串是字符数组)。使用学生的ID作为键(使用line.substring(0,line.indexOf(“”))和行的其余部分(字符串)作为Map的值(线),读取其余行并将其存储在Map中.substring(line.indexOf(”“)+ 1)+1是跳过的空间。

现在,你可以通过你的地图和每个学生的(串)的回答比较你的答案的关键

for (int i = 0; i < answer.Length; i++) 
{ 
    // Make sure you don't step out of bounds of the array for student's answer 
    // Any answers not checked will be considered wrong 
    if (i < studentsAnswer.Length) 
    { 
     if (studentsAnswer.charAt(i) != answer.charAt(1)) 
     { 
      numberOfIncorrect = numberOfIncorrect + 1; 
     } 
    } 
    else 
    { 
     numberOfIncorrect = numberOfIncorrect + 1; 
    } 
} 

希望这有助于...

+0

谢谢!我不知道Google Maps是什么,但即使只有正确的研究术语也能帮助我。 – ccsum 2015-03-31 20:58:45

+0

我编辑了我原来的帖子。将第一行保存为字符串的想法非常完美 - 但是我试图正确地将键/值输入到Map中,我很难过。也许我只是坚持语法? – ccsum 2015-04-01 00:25:08

+0

你的映射的第二个参数不需要是一个字符串数组,只需将它作为一个字符串(Map )即可。然后,当你把键/值放到你的地图中时,你不需要分割值(results.put(line.substring(0,8),line.substring(9))。只需浏览地图中的所有键/值对,然后就可以在我的答案中使用我的代码段来检查结果。 – Shar1er80 2015-04-01 13:36:23

相关问题