我正在为学校的实验室工作,所以任何帮助都会受到赞赏,但我不希望这为我解决。我在NetBeans工作,我的主要目标是通过从文本文件中扫描整数来创建“二维”数组。到目前为止,我的程序运行没有错误,但我错过了我的数组的第一列。我的输入如下:
6
3
0 0 45
1 1 9
2 2 569
3 2 17
2 3 -17
5 3 9999
-1
其中6是行数,3是列数,-1是哨兵。我的输出如下:
0 45
1 9
2 569
2 17
3 -17
3 9999
End of file detected.
BUILD SUCCESSFUL (total time: 0 seconds)
如您所见,除了丢失的第一列外,所有内容都打印正确。
这是我的计划:
import java.io.*;
import java.util.Scanner;
public class Lab3
{
public static void main(String[] arg) throws IOException
{
File inputFile = new File("C:\\Users\\weebaby\\Documents\\NetBeansProjects\\Lab3\\src\\input.txt");
Scanner scan = new Scanner (inputFile);
final int SENT = -1;
int R=0, C=0;
int [][] rcArray;
//Reads in two values R and C, providing dimensions for the rows and columns.
R = scan.nextInt();
C = scan.nextInt();
//Creates two-dimensional array of size R and C.
rcArray = new int [R][C];
while (scan.nextInt() != SENT)
{
String line = scan.nextLine();
String[] numbers = line.split(" ");
int newArray[] = new int[numbers.length];
for (int i = 1; i < numbers.length; i++)
{
newArray[i] = Integer.parseInt(numbers[i]);
System.out.print(newArray[i]+" ");
}
System.out.println();
}
System.out.println("End of file detected.");
}
}
显然,这里存在逻辑错误。有人可以解释为什么第一列是隐形的吗?有没有办法我只能使用我的rcArray或者我必须保留我的rcArray和newArray?另外,我怎样才能让我的文件路径只读“input.txt”,这样我的文件路径就不那么长了?文件“input.txt”位于我的Lab3 src文件夹(与我的程序相同的文件夹),所以我想我可以使用File inputFile = new File(“input.txt”);找到文件,但我不能。
//修改
好的,我已经更改了我的代码部分:
for (int i = 0; i < numbers[0].length(); i++)
{
newArray[i] = Integer.parseInt(numbers[i]);
if (newArray[i]==SENT)
break;
System.out.print(newArray[i]+" ");
}
System.out.println();
运行程序(从0开始而不是1)现在给出输出:
0
1
2
3
2
5
恰好是第一列。 :)我到了某个地方!
//编辑2
如果有人关心,我想出了一切。 :)感谢您的所有帮助和反馈。
答案 0 :(得分:2)
既然你不希望这个为你解决,我会给你一个提示:
Arrays in Java基于0,而非基于1。
答案 1 :(得分:1)
除了杰弗里关于数组基于0的性质之外,请看看:
while (scan.nextInt() != SENT)
{
String line = scan.nextLine();
...
你正在使用一个整数(使用nextInt()
),但你正在使用该值进行的检查是检查它不是SENT
。你可能想要这样的东西:
int firstNumber;
while ((firstNumber = scan.nextInt()) != SENT)
{
String line = scan.nextLine();
...
// Use line *and* firstNumber here
或者(更干净的IMO):
while (scan.hasNextLine())
{
String line = scan.nextLine();
// Now split the line... and use a break statement if the parsed first
// value is SENT.