-1

わかりました、このコードは私が持っている割り当ての一部です。equals() メソッドを実装して、2 つの線が等しいかどうかを確認します。2 つの端点が同じ場合、2 つの線は等しいと定義されます。ただし、ここでプログラムをそのまま実行すると、配列リストが空のように空白になるため、チェックできません。私の質問は次のとおりです。ファイルを介してループ読み取りを変更する必要がありますか、それとも最初の配列のコメントを外して、arrayList に関して何かを行う必要がありますか?

どんな助けでも大歓迎です!!

    //Line[] lines;

    ArrayList<Line> lines;     
    Scanner reader;

public MyDrawing()

    super();

    this.setPreferredSize(new Dimension(500,500));
}

/**
 *  Reads the file and builds an array of Line objects.
 *  
 * @param fileName The name of the file that contains the lines
 * @throws Exception
 */
public void read( File fileName ) throws Exception
{
    reader = new Scanner(fileName);

    //----------------
    // Change to Arraylist. Make the name of the arraylist "lines" so that code      in paintComponent works.
    //---------------------
    //Have to read the first number before starting the loop
    int numLines = reader.nextInt();
    //lines = new Line[numLines];
    ArrayList<Line>lines = new ArrayList<Line>();

ここで、arrayList をインスタンス化します

    //This loop adds a new Line object to the lines array for every line in the file read.
    while( reader.hasNext() ) {
        for( int i = 0; i < numLines; i++ ) {
            int x = reader.nextInt();
            int y = reader.nextInt();
            Point beg = new Point(x,y);
            x = reader.nextInt();
            y = reader.nextInt();
            Point end = new Point(x,y);

            String color = reader.next();

            Line l =  new Line( beg, end, color );

            //----------------
            // Change to make sure that you only add lines that don't already exist.
            //--------------------
            lines.add(l);
            //lines[i] = l;

ここで、行「l」をリストに追加しようとしました}

}


    if( lines != null ) {
        for( Line l: lines ) {
            int x1 = l.getBeg().getX();
            int y1 = l.getBeg().getY();
            int x2 = l.getEnd().getX();
            int y2 = l.getEnd().getY();

            g.setColor(l.color);
            g.drawLine(x1, y1, x2, y2);

            System.out.println(l);
        } 
    }
    //Print the action to the console
    System.out.println( "drawing lines" );
}

}

4

1 に答える 1

0

名前付きのインスタンス変数がありますが、メソッドlines内で使用していません。readメソッド内readで、同じ名前のローカル変数を宣言してlines読み込みますが、同じ名前のインスタンス フィールドは変更されません。したがって、そのインスタンス フィールドはnull後で使用しようとしたときに使用されます。if(lines != null)残念ながら、なぜあるべきではないのかを自問する代わりに、そのコードを保護していますnull

インスタンスフィールドを反復するコードlinesは、配列であるか、ArrayListそれを読み取るコードであるかに関係なく機能しますが、配列にはaddメソッドがないため、配列では機能しません。そのため、インスタンス変数を配列に変更すると、読み取りメソッドがまだコンパイルされているという事実は、その配列を使用していないというヒントを与えてくれます。

ArrayList<Line>lines = new ArrayList<Line>();read メソッド内の行を に変更しlines = new ArrayList<Line>();ます。次に、読み込んでいるリストが、後で使用するインスタンス フィールドに格納されます。linesもちろん、が配列として宣言されている場合はコンパイルされません。

于 2013-09-05T15:30:09.820 に答える