将双精度数从文件传输到数组时,包含字符串/布尔值的Java跳过行

时间:2017-03-27 16:23:11

标签: java arrays io

我正在为一所学校的项目工作,并且遇到了一部分问题。我在记事本中有一个文本文件,其中包含有关NHL中每个团队的数据:

Washington Capitals
3.02
2.33
85.2
30.6
28.4
True
Dallas Stars
3.23
2.78
82.3
32.0
28.9
True
...

我试图将所有双打放在数组中,但我似乎无法弄清楚如何跳过包含字符串或布尔值的所有行。

这是我到目前为止的代码:

    double data[][] = new double[30][6];
    int indexRow = 0, indexCol = 0, tracker = 0;

    File file = new File(fileName);
    Scanner input = new Scanner(file);

    while(input.hasNext())
    {
        if(tracker == 0 || tracker == 6)
        {
            //skip line
            if(tracker == 6)
                tracker = 0;
        }
        data[indexRow][indexCol] = input.nextDouble();

        if(indexCol < 6) indexCol++;
        if(indexRow < 30 && indexCol % 6 == 0)
        {
            indexRow++;
            indexCol = 0;
        }
        tracker++;
    }

反正是否只跳过包含字符串和布尔值的行?提前谢谢。

3 个答案:

答案 0 :(得分:1)

你可以这样试试......

try {
    double d = Double.valueOf(currentLine);
    // is double
} catch(NumberFormatException e) {
    // isn't
}

答案 1 :(得分:0)

你不能跳过一行,因为你需要首先阅读它,看看它是你想要的一条线还是一条线要扔掉。使用您提供的格式,只需读取该行的第一个字符,如果第一个字符是字母,则丢弃该行的其余部分。如果第一个字符是数字,则保留该行。

答案 2 :(得分:0)

由于答案已被接受,我不打算提供解决方案,但我想的越多,我就越感到被迫这样做。我在接受的答案中看到的问题是,它对输入数据进行了假设,为运行时异常留下了大门。 OOP的重点是创建健壮,可重用的代码,并为刚刚学习灌输不良实践IMO的人提供这种有限范围的解决方案。

我想到的一个解决方案是使用正则表达式检查字符串是否为数字:

public static boolean isNumeric (String s)
{
    return s.matches("[+-]?\\d*\\.?\\d*");
}

(注意:根据数值的范围,您可能需要修改正则表达式以允许使用逗号)

作为检查以确保一切正常:

public static void main (String[] args) {
    String[] nhlData = { "Washington Capitals",
                            "3.02",
                            "2.33",
                            "85.2",
                            "30.6",
                            "28.4",
                            "True",
                            "Dallas Stars",
                            "3.23",
                            "2.78",
                            "82.3",
                            "32.0",
                            "28.9",
                            "True",
                            "0",
                            "-5.",
                            "+100"};

    for (String s : nhlData) {
        System.out.print(s);
        if (isNumeric(s)) {
            System.out.println(" is numeric");
        } else {
            System.out.println(" is not numeric");
    }


    }
}

另一种解决方案是利用第三方库(如Apache Commons的强大功能,该库具有包含此功能的静态方法:请参阅StringUtils.IsNumeric()