2

私は学校の研究室で働いているので、助けていただければ幸いですが、これを解決したくありません。私はNetBeansで作業しており、主な目標は、テキストファイルから整数をスキャンして「2次元」配列を作成することです。これまでのところ、プログラムはエラーなしで実行されていますが、配列の最初の列がありません。私の入力は次のようになります:

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"はLab3srcフォルダー(プログラムと同じフォルダー)にあるので、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();

プログラムを実行すると(1ではなく0から開始)、次の出力が得られます。

0 
1 
2 
3 
2 
5 

これはたまたま最初の列です。:)私はどこかに行きます!

//編集2

誰かが気にする場合に備えて、私はすべてを理解しました。:)あなたの助けとフィードバックのすべてに感謝します。

4

2 に答える 2

2

あなたはこれをあなたのために解決したくないので、私はあなたにヒントを残します:

Javaの配列は、1ベースではなく、0ベースです。

于 2013-03-08T01:22:44.067 に答える
1

配列の0ベースの性質に関するJeffreyの指摘と同様に、これを見てください。

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.
于 2013-03-08T01:24:33.353 に答える