如何使用数组的一部分

时间:2014-07-25 18:09:07

标签: java arrays

很抱歉,如果每个人都看到我今天发布了很多愚蠢的问题(只是前言)。然而,这是暑期班的决赛,我的老师停止了关心/解释如何为我的第一个编码班做事。

对于这个项目,我必须以相反的顺序将.dat文件中的整数列表打印到程序中,阵列中最多有40个可能的值(完成所有这些)我遇到的问题是他说的程序也应该足够灵活,以处理少于40个值。但是根据我当前的代码,我总是遇到一个错误,说“nosuchelementexception”。任何帮助都会非常感激。以下是我所拥有的副本:

import java.io.*;               //Imports any file operation (ie Reading or Writing)
import java.util.Scanner;       //Imports scanner class

public class program3
{
    public static void main(String [] ars) throws IOException
    {
        double [] Values;               // creating array called value
        Values = new double [40];       // establishing array with 40 cells
        int k;                  // creating counter integer

        Scanner InputFile = new Scanner( new FileReader("temp.dat"));       // input file you wish to open.

        for (k = 0 ; k < Values.length ; k++)

            Values[k] = InputFile.nextDouble();


        for (k = Values.length - 1 ; k >= 0 ; k--)

            System.out.println("Cell " + k + " contains the value " + Values[k]);

        InputFile.close();
    }

}

8 个答案:

答案 0 :(得分:3)

您遇到的问题是数组的length属性是指声明的长度,而不是其中的数据量。

当您尝试使用长度(在本例中为40)来控制用于读取数据的循环时,如果要读取的元素较少,则会出现错误。

你想要做的是只有在有更多输入才能获得更多输入:

    int k = 0;
    while (inputFile.hasNextDouble()) {
        Values[k++] = inputFile.nextDouble();
    }

另外,请考虑使用ArrayList而不是数组。 ArrayList类允许您存储动态数据量,因此您不必担心预先分配存储空间:

    ArrayList<Double> values = new ArrayList<>();
    while (inputFile.hasNextDouble()) {
        values.add(inputFile.nextDouble());
    }

答案 1 :(得分:1)

您可以使用while循环和计数器

import java.io.*;               // Imports any file operation (ie Reading or Writing)
import java.util.Scanner;       // Imports scanner class

public class program3
{
    public static void main(String [] ars) throws IOException
    {
        double [] Values;               // creating array called Values
        Values = new double [40];       // establishing array has 40 cells
        int counter = 0;                  // creating counter integer

        Scanner inputFile = new Scanner( new FileReader("temp.dat"));       //input file you with to open.

        while(inputFile.hasNextDouble()){

            Values[counter] = InputFile.nextDouble();
            counter++;

        }
        for (i = counter - 1 ; i >= 0 ; i--)

            System.out.println("Cell " + i + " contains the value " + Values[i]);

        InputFile.close();
    }

}

答案 2 :(得分:0)

如果您不必使用数组,请使用ArrayList<Double>。这允许您调用values.add(value)添加到列表中。长度是可变的,您可以使用相同的代码(只需将values[i]替换为values.get(i)

但是,如果必须使用数组,则创建一个添加到数组的方法。从0长度数组开始,添加元素时,创建一个长度为+ 1的新数组,然后复制旧元素,并在末尾添加新元素。

还有很多其他方法可以解决这个问题,但这两种方法可以让您使用现有的工作代码。

数组方法:

values = new double[0];

public void add(double x){
    double[] temp = new double[values.length +1];
    for(int i =0; i< values.lenght; i++){
        temp[i] = values[i];
    }
    temp[temp.length-1] = x;
    values = temp;
}

答案 3 :(得分:0)

您应该使用arrayList,这样您就不必初始设置数组的大小。这将使你在数组中永远不会有空元素。

另一种选择是使用占位符值(例如-1)初始化数组,然后仅在值不为-1时执行切换。

答案 4 :(得分:0)

添加一个计数器,用于跟踪您放入阵列的项目数量,并使用它来确定打印出来时停止的位置。

答案 5 :(得分:0)

.dat文件中是否有40个元素。如果没有你的代码可能会给出异常。

for (k = 0 ; k < Values.length ; k++)
Values[k] = InputFile.nextDouble();

如果您的.dat文件不包含40个元素,则无法填写值[39]。

答案 6 :(得分:0)

阵列在初始化后具有固定大小,因此您可能希望使用动态数据结构,或者使用下面发布的while循环。在这种情况下,我个人会推荐ArrayList

您还应该使用方法

  

Scanner.hasNext()或您的特定情况Scanner.hasNextDouble()Docs

获取任何新元素。

所以你的程序看起来像这样:

import java.io.*;               //Imports any file operation (ie Reading or Writing)
import java.util.Scanner;       //Imports scanner class
import java.util.ArrayList;

public class program3
{
    public static void main(String [] ars) throws IOException
    {
        ArrayList<Double> doubles = new ArrayList<Double>();

        Scanner inputFile = new Scanner( new FileReader("temp.dat"));

        while (inputFile.hasNextDouble()) {
               doubles.add(inputFile.nextDouble());
        }

        inputFile.close();


        for (Double value : doubles) {
             System.out.println(value);
        }
    }

}

Java在其Collections类中有方便的方法来允许排序。如果您还没有,可能需要查看。

答案 7 :(得分:0)

我很佩服你的勇气进入Stack Overflow。 在这里奖励你的答案。

第一个for循环,你遍历新的空数组。除非您从扫描程序对象InputFile中检索信息,否则可以找到。

所以你实际上应该迭代那个对象!不是你的阵列。不过没有羞耻。经典错误。

这是我的代码版本:

import java.io.FileReader;
import java.io.IOException; //Imports any file operation (ie Reading or Writing)
import java.util.Scanner; //Imports scanner class

public class program3
{
    public static void main( String [] ars ) throws IOException
    {
        double [] Values; // creating array called value
        Values = new double [40]; // establishing array has 20 cells
        int k; // creating counter integer

        //input file you with to open.
        Scanner InputFile = new Scanner( new FileReader( "temp.dat" ) ); 

        for ( k = 0; InputFile.hasNextDouble(); k ++ )

            Values[k] = InputFile.nextDouble();


        for ( k = Values.length - 1; k >= 0; k-- )

            System.out.println( "Cell " + k + " contains the value " + Values[k] );

        InputFile.close();
    }
}

希望这有帮助!