String currentLine = reader.readLine();
while (currentLine != null)
{
String[] studentDetail = currentLine.split("");
String name = studentDetail[0];
int number = Integer.valueOf(studentDetail[1]);
currentLine = reader.readLine();
}
所以我有一个这样的文件:
student1
student16
student6
student9
student10
student15
当我运行该程序时说: ArrayIndexOutOfBoundsException异常:1
输出应如下所示:
student1
student6
student9
student10
student11
student15
student16
答案 0 :(得分:0)
假设所有行都以student
开头并以数字结尾,您可以阅读所有行并将其添加到list
,然后sort
list
student
之后的数字,然后print
每个元素。例如:
String currentLine;
List<String> test = new ArrayList<String>();
while ((currentLine = reader.readLine()) != null)
test.add(currentLine());
test.stream()
.sorted((s1, s2) -> Integer.parseInt(s1.substring(7)) - Integer.parseInt(s2.substring(7)))
.forEach(System.out::println);
输出:
student1
student6
student8
student9
如果您不想使用stream()
和lambda
,则可以list
使用自定义Comparator
,然后通过{{loop
对list
进行排序1}}并打印每个元素:
Collections.sort(test, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
int n1 = Integer.parseInt(s1.substring(7));
int n2 = Integer.parseInt(s2.substring(7));
return n1-n2;
}
});
答案 1 :(得分:0)
首先,编程到List
接口而不是ArrayList
具体类型。其次,使用try-with-resources
(或明确关闭reader
块中的finally
。第三,我会在循环中使用Pattern
(正则表达式)然后使用Matcher
来查找&#34; name&#34;和&#34;数字&#34;。这可能看起来像,
List<Student> student = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader(new File(infile)))) {
Pattern p = Pattern.compile("(\\D+)(\\d+)");
String currentLine;
while ((currentLine = reader.readLine()) != null) {
Matcher m = p.matcher(currentLine);
if (m.matches()) {
// Assuming `Student` has a `String`, `int` constructor
student.add(new Student(m.group(1), Integer.parseInt(m.group(2))));
}
}
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
最后,请注意Integer.valueOf(String)
会返回Integer
(然后您unbox)。这就是我在这里使用Integer.parseInt(String)
的原因。
答案 2 :(得分:-1)
您的文件必须像这样
student 1
student 2
student 3
不要忘记在学生和号码之间添加空格字符。
在迭代中,您必须添加以下行:
currentLine = reader.readLine();
您可以这样拆分:String[] directoryDetail = currentLine.split(" ");
而不是String[] directoryDetail = currentLine.split("");
因为当你使用String[] directoryDetail = currentLine.split("");
student1 时,结果是一个String长度为0的字符串数组