代码之家  ›  专栏  ›  技术社区  ›  Mateusz Dymczyk

从文件读取双精度值

  •  4
  • Mateusz Dymczyk  · 技术社区  · 15 年前

    我试图从一个文件中读取一些数字(双精度),并将它们存储在一个数组列表和一个数组中(是的,我需要两者),代码如下:

    try {
        Scanner scan = new Scanner(file).useDelimiter("\\s*\\n");
    
        while(scan.hasNextDouble())
        {
            tmp.add(scan.nextDouble());
        }
    
        Double[][] tmp2 = new Double[tmp.size()/2][2];
        int tmp3 = 0;
        for(int i = 0; i < tmp.size()/2; i++)
        {
            for(int j = 0; j < 2; j++)
            {
                tmp2[i][j] = tmp.get(tmp3);
                tmp3++;
            }
        }
    
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    }
    

    }

    我要读取的文件是:

    0.0 0.0
    0.023 0.023
    0.05 0.05
    0.2 0.2
    0.5 0.5
    0.8 0.8
    0.950 0.950
    0.977 0.977
    1.0 1.0

    但是我的代码不起作用,hasNextDouble()函数找不到任何东西,我做错了什么?

    编辑:好的,所以我对源进行了一点编辑(从object[][]改为double[]]),并在数组插入到arraylist后添加了插入值,但它仍然不起作用-“while”循环不会执行一次。

    4 回复  |  直到 10 年前
        1
  •  4
  •   Bill the Lizard    15 年前

    我试着把代码减少到只测试扫描仪本身。以下代码适用于您的数据文件:

    public static void main(String[] args) {
        Scanner scan;
        File file = new File("resources\\scannertester\\data.txt");
        try {
            scan = new Scanner(file);
    
            while(scan.hasNextDouble())
            {
                System.out.println( scan.nextDouble() );
            }
    
        } catch (FileNotFoundException e1) {
                e1.printStackTrace();
        }
    
    }
    

    我得到了以下(预期的)输出:

    0.0
    0.0
    0.023
    0.023
    0.05
    0.05
    0.2
    0.2
    0.5
    0.5
    0.8
    0.8
    0.95
    0.95
    0.977
    0.977
    1.0
    1.0
    

    尝试此操作以确保引用的文件正确。

        2
  •  1
  •   Carl Smotricz    15 年前

    下面是我对您的代码的呈现,经过调整使其运行。它立即爆炸,并出现数组索引异常。

    那么:你能给我们多一点框架吗?和我做的有什么不同?

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Zenzen {
    
       private static ArrayList<Double> tmp = new ArrayList<Double>();
    
       private static File file = new File("Zenzen.dat");
    
       public static void main(String[] args) {
    
          Scanner scan;
          try {
             scan = new Scanner(file);
             Object[][] tmp2 = new Object[tmp.size() / 2][2];
             int tmp3 = 0;
    
             while (scan.hasNextDouble()) {
                tmp.add(scan.nextDouble());
                System.out.println(Arrays.deepToString(tmp.toArray())); // debug print
                for (int i = 0; i < tmp.size() / 2; i++) {
                   for (int j = 0; j < 2; j++) {
                      tmp2[i][j] = tmp.get(tmp3);
                      tmp3++;
                   }
                }
             }
    
          } catch (FileNotFoundException fnfe) {
             fnfe.printStackTrace();
          }
       }
    }
    

    [0.0]
    [0.0, 0.0]
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
        at Zenzen.main(Zenzen.java:26)
    
        3
  •  0
  •   mrvisser    15 年前

    尝试先设置分隔符:

    scan.useDelimiter("\\s+");
    

    JavaDoc

        4
  •  0
  •   MindIbniM    10 年前

    我也有同样的问题(不工作的扫描器),解决方案似乎非常简单。 您只需要为它设置一个区域设置。

      // use US locale to be able to identify doubles in the string
      scanner.useLocale(Locale.US);
    

    从这里取: http://www.tutorialspoint.com/java/util/scanner_nextdouble.htm