我正在尝试编写一种扫描文本文件的方法,并将所有以#
开头的行添加到String
调用的元数据中。之后我想扫描接下来的三个整数,从第一行开始,不包含#
。但是,不包含#
的第一行会被跳过,因为我已经使用scan.nextLine()
来扫描它。
File file = new File(filename);
Scanner scan = new Scanner(file);
String format = scan.nextLine();
String metadata = "";
//This loop adds all lines starting with # to metadata.
outerloop:
while(scan.hasNextLine()){
String line = scan.nextLine();
if(line.startsWith("#")){
metadata = metadata+line;
} else {
break outerloop;
}
}
//Scans the next three integers and sets them equal to width, height, and maxRange.
int width = scan.nextInt();
int height = scan.nextInt();
int maxRange = scan.nextInt();
我的输入是一个文本文件。前六行显示在此屏幕截图中。
只有一行以#开头,但我的方法必须能够处理多行以#开头的文件。输出应为
format = "P3"
metadata = "# CREATOR: GIMP PNM Filter Version 1.1"
width = 200
height = 133
maxRange = 255
然而我得到
format = "P3"
metadata = "# CREATOR: GIMP PNM Filter Version 1.1"
width = 255
height = 183
maxRange = 187
答案 0 :(得分:1)
你的行是一个字符串。您可以搜索与以下正则表达式匹配的所有子字符串:
[0-9]+
这可以通过以下方式完成:
List<String> matches = new ArrayList<>();
Matcher m = Pattern.compile("[0-9]+")
.matcher(readLineWhichIsString);
while (m.find()) {
matches.add(m.group());
}
int[] numbersInLine = new int[matches.size()];
for (int i = 0; i < matches.size(); i++) {
numbersInLine[i] = Integer.parseInt(matches.get(i));
}
上述解决方案将与12
中的12a
相匹配。如果你不想要它,只需更改正则表达式。我会为你做一些研究。
Matcher m = Pattern.compile("[0-9]+(?=\\s|$)")
仅匹配String
个数字,后跟String
的空格或结尾。
修改强>
以下代码将使用int[] values
参数填充int
。
String line;
while(scan.hasNextLine()){
line = scan.nextLine();
if(line.startsWith("#")){
metadata = metadata+line;
}else{
break outerloop;
}
}
int[] values = new int[3];
List<String> matches = new ArrayList<>();
Matcher m = Pattern.compile("[0-9]+(?=\\s|$)")
.matcher(readLineWhichIsString);
while (m.find()) {
matches.add(m.group());
}
int i = 0;
for (i = 0; i < Math.min(matches.size(), values.length); i++) {
numbersInLine[i] = Integer.parseInt(matches.get(i));
}
while (i < 3) {
values[i] = scan.nextInt();
}
答案 1 :(得分:0)
当你检查#in in line并且你不想再读那行时,你的问题是逻辑上的
这是一个建议的解决方案
//This loop adds all lines starting with # to metadata.
String line = null;
while(scanner.hasNextLine()){
line = scanner.nextLine();
if(line.startsWith("#")){
metadata = metadata+line;
}else{
break ;
}
}
//Scans the next three integers and sets them equal to width, height, and maxRange.
String ints[]=line.split(" ");
int width = Integer.parseInt(ints[0]);
int height = Integer.parseInt(ints[1]);
int maxRange = scanner.nextInt();
这有效,你得到了理想的回报 以及为什么要在已有行
时重新读取文件