有没有办法使用Scanner对象在文本文档中搜索特定数据?

时间:2014-08-15 00:47:25

标签: java arrays java.util.scanner

我正在制作一个从格式化文本文档中读取数据的程序:

  

行星数据

     

行星直径(km)质量(kg)g(m / s ^ 2)

     
      
  • Mercury 4880 3.30E + 23 3.70
  •   
  • Venus 12104 4.87E + 24 8.87
  •   
  • 地球12756 5.97E + 24 9.79
  •   
  • Mars 6794 6.24E + 23 3.61
  •   
  • Jupiter 142984 1.90E + 27 24.80
  •   
  • 土星120536 5.68E + 26 10.43
  •   
  • 天王星51118 8.68E + 25 8.86
  •   
  • 海王星49352 1.02E + 26 11.17
  •   

在文本文件中,它更漂亮,但基本上它是一个四列文档,每个列都有一个数字信息。我正在使用扫描仪类尝试只读取最后一列数字,但无法使用大量的nextLine()调用找到一种简单的方法。有没有更好的方法来搜索那些双打,并用扫描仪将它们拉成阵列?

这段代码会编译,但是一旦运行就会出现不匹配错误。

public static double [] getGravity()throws IOException{
    Scanner inFile = new Scanner(new File("PlanetaryData.txt"));
    double [] getGrav = new double[8];
    for(int i = 0; i < 8; i++){
        getGrav[i] = inFile.nextDouble();
        getGrav[i] /= 10;
        System.out.println(getGrav[i]);
    }
    return getGrav;
}

2 个答案:

答案 0 :(得分:2)

假设您的文本文件结构如下:

Mercury 4880 3.30E+23 3.70
Venus 12104 4.87E+24 8.87
Earth 12756 5.97E+24 9.79
Mars 6794 6.24E+23 3.61
Jupiter 142984 1.90E+27 24.80
Saturn 120536 5.68E+26 10.43
Uranus 51118 8.68E+25 8.86
Neptune 49352 1.02E+26 11.17

你可以试试这个:

public static double [] getGravity()throws IOException{
    Scanner inFile = new Scanner(new File("PlanetaryData.txt"));
    double [] getGrav = new double[8];
    for(int i = 0; i < 8; i++){
        getGrav[i] = inFile.nextLine().split("\\s+")[3];
        System.out.println(getGrav[i]);
    }
    return getGrav;
}

答案 1 :(得分:1)

一种可能性是使用双打列表来存储您的阅读重要值,例如

List<Double> al = new ArrayList<>();
Scanner scanner = null;
try {
  scanner = new Scanner(new File("file.txt"));
  while (scanner.hasNextLine()) {
    String str = scanner.nextLine();
    if (str == null) {
      continue;
    }
    double gravity = Double.parseDouble(
        str.substring(1 + str.lastIndexOf(' ')).trim());
    al.add(gravity);
  }
} catch (Exception e) {
  e.printStackTrace();
} finally {
  if (scanner != null) {
    scanner.close();
  }
}
System.out.println(al);

然而,行星名称和价值之间没有直接联系。另一种选择是使用Map<String, Double>将行星名称和值关联起来,如

Map<String, Double> map = new HashMap<>();
Scanner scanner = null;
try {
  scanner = new Scanner(new File("file.txt"));
  while (scanner.hasNextLine()) {
    String str = scanner.nextLine();
    if (str == null) {
      continue;
    }
    String planet = str.substring(0, str.indexOf(' '));
    double gravity = Double.parseDouble(
        str.substring(1 + str.lastIndexOf(' ')).trim());
    map.put(planet, gravity);
  }
} catch (Exception e) {
  e.printStackTrace();
} finally {
  if (scanner != null) {
    scanner.close();
  }
}
System.out.println(map);