将.txt文件中的Double读入数组列表

时间:2018-09-04 21:02:24

标签: java arraylist

所以我们有了这个程序,我们必须在其中将文本文件中的双精度值读取到双精度ArrayList中并进行某些计算。

文本文件示例:

注意:日期和双精度值之间有空格

5/05/1998 4.4

1/01/1999 -4.123

问题是我得到的信息如下:

  

“输入字符串的NumberFormatException:1/2/1950 0.0258”错误。

这是我的代码:

public static void value() throws java.io.IOException{
    try{
        BufferedReader br = new BufferedReader(new FileReader(new File("SP500-Weekly.txt")));
        ArrayList<Double>list = new ArrayList<Double>();
        String line;
        while((line=br.readLine())!=null){
            String[] r = line.split("    ");
            for(int i=0; i<r.length; i++){
                double val = Double.parseDouble(r[i]);
                list.add(val);
            }
        }br.close();
        System.out.println(list.size());
    }
    catch(IOException io){
        System.out.println("error");
    }
}

3 个答案:

答案 0 :(得分:1)

似乎您只需要在每行上显示double值,然后将其添加到List<Double>中即可。根据您的输入,第二个值始终是您的双精度值,但您也尝试解析第一个值,即日期,Double.parseDouble()无法解析日期为/的字符,因此,您遇到了异常。如果您需要double值,则只需执行以下操作即可:

try {
        BufferedReader br = new BufferedReader( new FileReader( new File( "SP500-Weekly.txt"" ) ) );
        List<Double> list = new ArrayList<Double>();
        String line;

        while ( ( line = br.readLine( ) ) != null ) {

            String[] r = line.split( "\\s+" );
            list.add( Double.parseDouble( r[ 1 ] ) );
        }
        br.close( );
        System.out.println( list.size( ) );
    } catch ( IOException io ) {
        e.printStackTrace( );
    }

然后,您可以根据需要使用list变量。

此外,如果您想更具体一点,并检查第二个值是否实际上是数字/双精度数,那么我将按照以下步骤添加一个正则表达式,以确保第二个值是数字(带或不带{{1} }符号),如下所示:

-

答案 1 :(得分:1)

使用java.nio和纯Java 8对此进行非常简单和最新的实现。

private static List<Double> readDoubles(final String fileName) {
   try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
            return stream.map(s -> s.split("\\s+")[1])
                .map(Double::parseDouble)
                .collect(Collectors.toList());
   } catch (IOException e) {
       e.printStackTrace();
   }
   return Collections.emptyList();
}

实施还需要使用try-with-resources自动管理各种资源。

答案 2 :(得分:0)

正确的代码:

import java.util.List;
class Sample extends SimulateMarket{
    public static void value(){
    try{
        BufferedReader br = new BufferedReader(new FileReader(new File("SP500-Weekly.txt")));
        List<Double> list = new ArrayList<Double>();
        String line;
        while((line=br.readLine())!=null){
            String[] r = line.split("\\s+");
            list.add(Double.parseDouble(r[1]));
        }br.close();
        Random rand = new Random();
        int randomIndex = rand.nextInt(list.size());
        System.out.println(list.get(randomIndex));
    }
    catch(IOException io){
        System.out.println("error");
    }
}

}