如何为文本文件中的行数创建适当大小的数组

时间:2012-12-06 01:28:45

标签: java arrays arraylist

我试图逐行读取文本文件。在每一行上有两个用逗号分隔的双数字(代表x,y点)。我想把它们放在两个双打数组中(一个包含x点,另一个包含y点),以便它们在文件中。数组的大小应与文件中的点数相同(即文件中的行数)。

文件可能有不同的点数,因此我不想为所有文件声明固定大小。我该怎么做呢?

修改

我这样做的方式有问题:

BufferedReader input; 

ArrayList<Double> xpointArrayList = new ArrayList<Double>();
ArrayList<Double> ypointArrayList = new ArrayList<Double>();
try {
    input = new BufferedReader(new FileReader(args[0]));
    String line;
    while ((line = input.readLine()) != null) {
        line = input.readLine();
        String[] splitLine = line.split(",");

        double xValue = Double.parseDouble(splitLine[0]);
        double yValue = Double.parseDouble(splitLine[1]);

        xpointArrayList.add(xValue);
        ypointArrayList.add(yValue);
    }
    input.close();

    } catch (IOException e) {

    } catch (NullPointerException npe) {

    }

    double[] xpoints = new double[xpointArrayList.size()];
    for (int i = 0; i < xpoints.length; i++) {
        xpoints[i] = xpointArrayList.get(i);
    }
    double[] ypoints = new double[ypointArrayList.size()];
    for (int i = 0; i < ypoints.length; i++) {
        ypoints[i] = ypointArrayList.get(i);
    }

当我在xpoints和ypoints数组上执行Array.toSring调用时。它只有一个数字。例如,在文件中:

1,2 / 3,4 / 0,5

xpoints数组只有3.0,ypoints数组只有4.0。哪里出错了?

4 个答案:

答案 0 :(得分:1)

如何制作ArrayList类型的PointArrayList将增长到内容的大小,因此它应该像执行此类操作一样简单(伪代码)...

ArrayList<Point> points = new ArrayList<Point>();

for (each line of the file){
    String line = file.readLine();
    String[] splitLine = line.split(",");

    double xValue = Double.parseDouble(splitLine[0]);
    double yValue = Double.parseDouble(splitLine[1]);

    points.add(new Point(xValue,yValue));
}

Point类被设计为2个double值的容器,用于表示任何完全符合您需求的抽象点。请参阅Point文档。

如果你真的需要使用2个数组,我的建议是使用ArrayList<Double> ...

ArrayList<Double> xPoints = new ArrayList<Double>();
ArrayList<Double> yPoints = new ArrayList<Double>();

for (each line of the file){
    String line = file.readLine();
    String[] splitLine = line.split(",");

    double xValue = Double.parseDouble(splitLine[0]);
    double yValue = Double.parseDouble(splitLine[1]);

    xPoints.add(xValue);
    yPoints.add(yValue);
}

有关详细信息,请参阅ArrayList文档。

如果你真的需要使用数组,可以将ArrayList转换成这样的数组......

Double[] xArray = (Double[])xPoints.toArray();
Double[] yArray = (Double[])yPoints.toArray();

答案 1 :(得分:1)

唐&#39;吨。你要求一个可变大小的数组。使用ArrayList。你不必指定一个初始大小,它会随着你需要而变大。此外,制作一个点类来处理这些数据可能是值得的。这样你就可以得到一个点列表。

public class Point
{
private double x;
private double y;

public point(double x, double y)
{
this.x = x;
this.y = y;
}

public double getX()
{
return x;
}

public double getY()
{
return y;
}
}

List<Point> myPoints = new ArrayList<Point>();

而且,如果你真的喜欢常规数组:      myPoints.toArray();

答案 2 :(得分:1)

正如您已经打开并从文件中读取简单的方法是将计数器放入循环并读取所有行。

  int count =0;
  while ((strLine = br.readLine()) != null)   {
      count++;
      System.out.println( strLine + " : "+ count);
  }

答案 3 :(得分:0)

FileObject.length()将返回一个文件中的bites数,除以double类型整数的大小(8个字节?),你将拥有存储在你的文件中的双变量数,除以如果我正确理解你的问题,你可以再次按2(或将原始数字除以4),你的文件中应该有行数。