如何扫描已使用scan.nextLine()扫描的行中的整数

时间:2016-11-23 18:21:17

标签: java java.util.scanner

我正在尝试编写一种扫描文本文件的方法,并将所有以#开头的行添加到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();

我的输入是一个文本文件。前六行显示在此屏幕截图中。

screenshot

只有一行以#开头,但我的方法必须能够处理多行以#开头的文件。输出应为

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

2 个答案:

答案 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();

这有效,你得到了理想的回报 以及为什么要在已有行

时重新读取文件