如何将文件中的元素总数添加到数组中?

时间:2014-04-27 18:05:02

标签: java arrays

我需要创建一个在方法中读取文件的程序。该文件是“data.txt”类型,并且将具有一个数字列表(双数据类型),每行有一个数字。 例如:

23.4
12.3
111.4533

然后我需要将它放在一个数组(不是2D数组)中并将其返回到main方法。 我使用filename.length()但是它使数组大小应该大于我应该得到一个数组越界错误。 我可以在while循环中初始化数组,但它一直说我需要先声明数组的大小,我不知道如何做到这一点。所以我尝试使用while循环来获取行数,然后使用另一个循环来输入元素但是它不会让我在没有初始化数组的情况下将数组返回到main方法。这是我到目前为止所做的:

java.io.File file = new java.io.File(file);
int arraySize = (int)file.length();
int size = 0;
int i = 0;
try{
    Scanner input = new Scanner(file);
    while(input.hasNextLine()){
        size++;
    }    
    double [] array;
    array1 = new double [size];

    while(input.hasNext()){
        array[i] = input.nextDouble();
        i++;
    }

有什么建议吗?我真的坚持这个。感谢。

5 个答案:

答案 0 :(得分:1)

两种可能的解决方案:

a)使用按需增长而不是使用固定数组(例如,ArrayList)的集合。您也可以将其转换为数组。

b)关闭扫描仪并在计算行数后再次打开文件。

答案 1 :(得分:0)

假设您的filename变量是文件名的字符串,那么filename.length仅为您提供名称中的总字符数。如果您已调用File对象filename,则filename.length()将返回文件长度的long,而不是其中的行数。

要获取文件中的行数,您可以参考此问题获取许多可能的答案:Number of lines in a file in Java

但是您更有可能希望使用可扩展的Collection而不是固定长度array,因为在开始使用它之前,您不需要计算和读取整个文件。像ArrayList这样的东西可能是理想的。但这取决于您的使用案例 您可以随后将ArrayList转换回Array

String[] lines = lineList.toArray(new String[lineList.size()]);

答案 2 :(得分:0)

我建议使用ArrayList。这样,在创建阵列时,您不必了解大小。正如其他人所说,在完成向ArrayList添加值后,您可以转换为数组。

假设你的data.txt文件一行一行地没有空格。你可以使用以下代码:

    ArrayList <Double> doubleArray = new ArrayList<Double>();
    Scanner fileScan = null;

    try {
        fileScan = new Scanner(new File("/path/to/file"));
        while (fileScan.hasNextDouble()){
             doubleArray.add(fileScan.nextDouble());
    }

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   

答案 3 :(得分:0)

现在的问题是你没有重新定义Scanner,所以在你确定大小之后,Scanner就在文件的末尾,因此没有更多的双重要读取in。

此外,在确定大小时,您需要实际读取每个循环的行,以便跳到新行,否则我认为您将有一个无限循环。如果你从来没有读过一行,它总是有更多。

试试这个(测试并运作):

java.io.File file = new java.io.File(file);
int size = 0;
int i = 0;
try {
    Scanner input = new Scanner(file);
    while(input.hasNextLine()){
        input.nextLine(); // have to change the lines
        size++;
    }    
    double [] array;
    array = new double [size];

    // reopen the file so you start from the beginning again
    input = new Scanner(file);

    while(input.hasNext()){
        array[i] = input.nextDouble();
        i++;
    }

    // print out the array
    for (double d : array) {
        System.out.println(d);
    }

} catch (Exception e) {
    e.printStackTrace();
}

或者您可以使用没有定义大小的ArrayList(您可以.add元素,因此您不需要事先知道大小来填充它。然后,如果您愿意,只需将ArrayList转换为常规数组后缀。

试试这个:

java.io.File file = new java.io.File("C:\\Users\\Mike\\Desktop\\data.txt");
try {
    Scanner input = new Scanner(file);
    ArrayList<Double> list = new ArrayList<Double>(); // define empty ArrayList

    while(input.hasNextLine()) {
        list.add(input.nextDouble()); // have to change the lines
    }

    // convert ArrayList to array
        // (although you don't need to do this if you're fine with an ArrayList)
    double[] array = new double[list.size()];
    for (int i = 0; i < list.size(); i++) {
        array[i] = list.get(i);
    }

    // print out the array
    for (double d : array) {
        System.out.println(d);
    }

} catch (Exception e) {
    e.printStackTrace();
}

答案 4 :(得分:0)

使用下面的代码

逐行读取文本文件,并将每个行元素解析为double 将双解析值添加到arraylist

将arraylist转换为数组。

String fileName=null;
     File file = null;
    try {
          fileName="path/filename.txt";
             file = new File(fileName);
    } catch (Exception e) {
        System.out.println(e.getMessage());
        // TODO: handle exception
    }

List<Double> elements = new ArrayList<>();

    try{
        Scanner input = new Scanner(file);
      while(input.hasNextLine()){
          elements.add(Double.parseDouble(input.nextLine()));
      }

          double[] ret = new double[elements.size()];
          for(int index = 0;index < ret.length;index++)
            ret[index] = elements.get(index);

     System.out.println(ret);
     System.out.println("end");
}
    catch(Exception e){

    }