0

編集: この投稿に出くわした人のために、通常の配列の代わりに ArrayList を使用して問題を修正しました。これにより、コードの約 3 分の 1 を切り取り、その多くを再利用可能にしました。以下を手伝ってくれたすべての人に感謝します。探している人のための私の更新されたコードへのリンクは次のとおりです: http://pastebin.com/Yh3LVu2H

このプログラムは、ファイルの行を読み取り、それらを xAxis と yAxis の 2 つの配列に出力することを目的としています。また、ScreenSizes.java を使用して GUI を構築するため、2 つのファイルに分割します。

「System.out.println("X: " + xAxis[index]);」という行で例外が発生します。

ScreenSizes.java からのコード:

package screensizes;
import java.io.*;
import java.util.Scanner;
import java.util.Arrays;
public class ScreenSizes{    

    public String filePath = "/Users/jonny/Documents/UNI/ScreenSizes/xy.txt";

    public static void main(String[] args) throws FileNotFoundException
    {
    ScreenSizes obj = new ScreenSizes();
        obj.run();
    }

    public void run() throws FileNotFoundException {
        GetScreens data = new GetScreens(filePath);
        int noLines = data.countLines();
        int[] xAxis = data.getData('x');
        int[] yAxis = data.getData('y');
    int index = 0;
        while(index<noLines){
        System.out.println("X: " + xAxis[index]);
        index++;
        }
    }
}

GetScreens.java のコード

package screensizes;
import java.io.*;
import java.util.Scanner;
import java.util.Arrays;

public class GetScreens
{

    public int lines;
    public String filePath = "";
    public int[] x = new int[lines];    
    public int[] y = new int[lines];

    public GetScreens(String aFileName) throws FileNotFoundException{
        fFile = new File(aFileName);
        filePath = aFileName;
        try
        {
        processLineByLine();
        countLines();
        }
        catch(FileNotFoundException fnfe)
        {
            System.out.println(fnfe.getMessage());
        }
        catch(IOException ioe)
        {
            System.out.println(ioe.getMessage());
        }
    }

    public final void processLineByLine() throws FileNotFoundException {
        //Note that FileReader is used, not File, since File is not Closeable
        Scanner scanner = new Scanner(new FileReader(fFile));
        try {
            while ( scanner.hasNextLine() ){
                processLine( scanner.nextLine() );
            }
        }
        finally {
            //ensure the underlying stream is always closed
            //this only has any effect if the item passed to the Scanner
            //constructor implements Closeable (which it does in this case).
            scanner.close();
        }
    }

    public int[] getData(char choice){
        if(choice == 'x'){
            return x;
        }
        else{
            return y;
        }
    }

    public void processLine(String aLine){
        //use a second Scanner to parse the content of each line 
        Scanner scanner = new Scanner(aLine);
        scanner.useDelimiter("x");
        if ( scanner.hasNext() ){
           for(int i=0; i<lines; i++){            
                x[i] = scanner.nextInt();
                y[i] = scanner.nextInt();
           }
        }
        else {
            log("Empty or invalid line. Unable to process.");
        }
    }

    public int countLines(){
        try
        {
            BufferedReader reader = new BufferedReader(new FileReader(filePath));
            while (reader.readLine() != null) lines++;
            reader.close();
        }

        catch(FileNotFoundException fnfe)
        {
            System.out.println(fnfe.getMessage());
        }

        catch(IOException ioe)
        {
            System.out.println(ioe.getMessage());
        }
        return lines;
    }

    // PRIVATE 
    public final File fFile;

    private void log(Object aObject){
        System.out.println(String.valueOf(aObject));
    }

    private String quote(String aText){
        String QUOTE = "'";
        return QUOTE + aText + QUOTE;
    }
} 
4

5 に答える 5

0

@ジョニー

あなたが与えたprocessLineメソッドで

for(int i = 0;i<行;i++)

{{

            x[i] = scanner.nextInt();
            y[i] = scanner.nextInt();

}

しかし、scanner.nextInt()をx[i]とy[i]にできないという背後にあるロジックを理解していない。x[i]とy[i]を割り当てる際の主な問題

使用する

           x[i] = Integer.parseInt(scanner.next());

           y[i] = Integer.parseInt(scanner.next());
于 2012-06-11T05:57:35.900 に答える
0

配列を使用する必要がある場合は、最初にで行をカウントしてからcountLines()、で配列を初期化する必要があります。

 x = new int[lines];
 y = new int[lines];

その後、実際に処理を開始できます...

結果は次のようになります。

public GetScreens(String aFileName) throws FileNotFoundException{
    fFile = new File(aFileName);
    filePath = aFileName;
    try
    {
        countLines();
        x = new int[lines];
        y = new int[lines];
        processLineByLine();
    } catch(FileNotFoundException fnfe) {
        System.out.println(fnfe.getMessage());
    }
    catch(IOException ioe) {
        System.out.println(ioe.getMessage());
    }
}

ただし、このコード/デザインは、後で使用するとエラーが増える可能性が非常に高くなります。関数に戻り値を使用することを考えたいと思います。(たとえば、countLines()2回実行すると、そのファイルに実際にある行が2倍になります...

ArrayList使用すると、コードがはるかに安全になると思います。

于 2012-06-11T06:52:30.977 に答える
0

ファイル内のレコード数に従ってint[] xandを再初期化する必要があります。int[] y

于 2012-06-11T05:18:58.837 に答える
0

あなたのGetScreensクラスでは、インスタンス変数linesは暗黙的に に初期化されてい0ます。したがって、x配列yの長さはゼロです。要素はありません。

したがって、他のクラスでそれらを使用しようとすると、ArrayIndexOutOfBoundsException.

lines便利なものに初期化します。

プログラムをコンパイルするときは、次のような警告に注意してくださいThe variable _lines_ may not have been initialized

于 2012-06-11T05:19:25.583 に答える
0
public int[] x = new int[lines];    
public int[] y = new int[lines];

は次のように優れています。

public int[] x = new int[0];    
public int[] y = new int[0];

それらを使用する前にこれを行ってください:

x = new int[countLines()];    
y = new int[countLines()];

--V

于 2012-06-11T05:20:46.780 に答える