Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将文件中的元素总数放入数组中?_Java_Arrays - Fatal编程技术网

Java 如何将文件中的元素总数放入数组中?

Java 如何将文件中的元素总数放入数组中?,java,arrays,Java,Arrays,我需要制作一个程序,用一个方法读取一个文件。该文件是“data.txt”类型,将有一个数字列表(双数据类型),每行有一个数字。 例: 然后我需要将其放入一个数组(不是2D数组)并将其返回到main方法。 我使用了filename.length(),但它使数组大小超出了应有的大小,并且我得到了一个数组越界错误。 我可以在while循环中初始化数组,但它一直说我需要先声明数组的大小,我不知道如何做。因此,我尝试使用while循环来获取行数,然后使用另一个循环来输入元素,但它不允许在不初始化数组的情况

我需要制作一个程序,用一个方法读取一个文件。该文件是“data.txt”类型,将有一个数字列表(双数据类型),每行有一个数字。 例:

然后我需要将其放入一个数组(不是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++;
    }

有什么建议吗?我真的被这件事缠住了。谢谢。

两种可能的解决方案:

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


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

假设
文件名
变量是文件名的字符串,则
文件名。长度
仅给出名称中的总字符数。如果调用了
文件
对象
文件名
,则
文件名.length()
返回文件长度的
long
,以字节为单位,而不是其中的行数

要获得文件中的行数,您可以参考此问题以获得许多可能的答案:

但更可能的情况是,您希望使用可扩展的
集合
而不是固定长度的
数组
,因为您不需要在开始使用之前计算和读取整个文件。类似于
ArrayList
的东西可能是理想的。但这取决于您的用例。
之后,您始终可以将
阵列列表
转换回
阵列

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

我建议使用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();
    }   
ArrayList doubleArray=new ArrayList();
Scanner fileScan=null;
试一试{
fileScan=newscanner(新文件(“/path/to/File”);
while(fileScan.hasNextDouble()){
添加(fileScan.nextDouble());
}
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}   

现在的问题是,您没有重新定义
扫描仪
,因此在确定大小后,
扫描仪
位于文件的末尾,因此没有更多要读取的双精度扫描仪

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

尝试以下方法(经过测试,效果良好):


或者您可以只使用没有定义大小的(您可以
。向其中添加
元素,这样您就不需要事先知道大小来填充它)。然后只要将
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();
}
java.io.File File=new java.io.File(“C:\\Users\\Mike\\Desktop\\data.txt”);
试一试{
扫描仪输入=新扫描仪(文件);
ArrayList=新建ArrayList();//定义空ArrayList
while(input.hasNextLine()){
list.add(input.nextDouble());//必须更改行
}
//将ArrayList转换为array
//(虽然如果您对ArrayList没有问题,则不需要执行此操作)
double[]数组=新的double[list.size()];
对于(int i=0;i
使用下面的代码

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

将arraylist转换为array

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){

    }
字符串文件名=null;
File=null;
试一试{
fileName=“path/fileName.txt”;
文件=新文件(文件名);
}捕获(例外e){
System.out.println(e.getMessage());
//TODO:处理异常
}
列表元素=新的ArrayList();
试一试{
扫描仪输入=新扫描仪(文件);
while(input.hasNextLine()){
add(Double.parseDouble(input.nextLine());
}
double[]ret=新的double[elements.size()];
对于(int index=0;index
使用ArrayList而不是array,这样您就不需要提前知道大小。如果您仍然需要返回数组,请在返回之前将ArrayList转换为数组。请让我知道我的答案是否适合您。我以前没有使用数组列表,很遗憾,我需要使用普通数组。非常感谢!你帮了很多忙。它确实起作用了,但我必须改变一些东西来防止.hasNextLine()无限运行。@user3552956没问题。很乐意帮忙。
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();
}
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){

    }