很抱歉,如果每个人都看到我今天发布了很多愚蠢的问题(只是前言)。然而,这是暑期班的决赛,我的老师停止了关心/解释如何为我的第一个编码班做事。
对于这个项目,我必须以相反的顺序将.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();
}
}
答案 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();
}
}
希望这有帮助!